心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0

思路是:用动态规划求出每个“城堡”可能的高度,最后扫描一遍即可。意思就是如果对于前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;
}

posted on 2010-01-06 20:29 lee1r 阅读(427) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:动态规划

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理