思路是:用動(dòng)態(tài)規(guī)劃求出每個(gè)“城堡”可能的高度,最后掃描一遍即可。意思就是如果對(duì)于前k-1層,如果高度h是可能的,那么對(duì)于前k層,h+a[k]是可能的。注意要先求出初始高度最小的那個(gè)城堡高度min,因?yàn)樽罱K高度比min還高是不可能的,這樣可以提高效率,減少遞推量。一開始循環(huán)的順序?qū)懛戳耍坏昧?0分,自己感覺能得70運(yùn)氣還是不錯(cuò)的了……
以下是我的代碼(沒有秒殺,660ms):
#include<stdio.h>

long n,min,find,a[101][101]=
{0},sum[101]=
{0},d[101][10001]=
{0};
void init()


{
long i,tmp;
scanf("%ld",&n);
min=200000000;
find=0;
for(i=1;i<=n;i++)

{
scanf("%ld",&tmp);
while(tmp!=-1)

{
a[i][0]++;
a[i][a[i][0]]=tmp;
sum[i]+=tmp;
scanf("%ld",&tmp);
}
if(sum[i]<min) min=sum[i];
}
}
void work()


{
long i,j,k;
for(i=1;i<=n;i++)
d[i][0]=1;
for(k=1;k<=n;k++)

{
for(i=1;i<=a[k][0];i++)
for(j=min;j>=0;j--)
if(j-a[k][i]>=0&&d[k][j-a[k][i]]==1)
d[k][j]=1;
}
for(i=min;i>=1;i--)

{
for(j=1;j<=n;j++)
if(d[j][i]!=1)
break;
if(j==n+1)

{
printf("%ld\n",i);
return;
}
}
printf("%ld\n",0);
}
int main()


{
init();
work();
return 0;
}
