vijos P1059 积木城堡

vijos P1059 积木城堡

思路是:用动态规划求出每个“城堡”可能的高度,最后扫描一遍即可。意思就是如果对于前k-1层,如果高度h是可能的,那么对于前k层,h+a[k]是可能的。注意要先求出初始高度最小的那个城堡高度min,因为最终高度比min还高是不可能的,这样可以提高效率,减少递推量。一开始循环的顺序写反了,只得了70分,自己感觉能得70运气还是不错的了……

以下是我的代码(没有秒杀,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;
}

你可能感兴趣的:(vijos P1059 积木城堡)