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

这是noip2008的第三题,前两题基本只要认真一点,都是送分。

多进程的动态规划题。

我是使用了四维的数组,完全可以AC,空间也可以承受。

对角线划分状态,可以优化到三维。

以下是我的代码:
#include<stdio.h>
#define max(a,b) (a>b?a:b)
typedef unsigned 
long Long;
Long d[
52][52][52][52]={0};
int main()
{
    Long m,n,a[
52][52]={0};
    Long i,j,i1,j1,i2,j2;
    FILE 
*fin,*fout;
    fin
=fopen("message.in","r");
    fscanf(fin,
"%ld%ld",&m,&n);
    
for(i=1;i<=m;i++)
      
for(j=1;j<=n;j++)
        fscanf(fin,
"%ld",&a[i][j]);
    fclose(fin);
//------Read In
    for(i1=1;i1<=m;i1++)
      
for(j1=1;j1<=n;j1++)
        
for(i2=1;i2<=m;i2++)
          
for(j2=1;j2<=n;j2++)
          
{
             d[i1][j1][i2][j2]
=max(d[i1-1][j1][i2-1][j2],d[i1-1][j1][i2][j2-1]);
             d[i1][j1][i2][j2]
=max(d[i1][j1][i2][j2],d[i1][j1-1][i2-1][j2]);
             d[i1][j1][i2][j2]
=max(d[i1][j1][i2][j2],d[i1][j1-1][i2][j2-1]);
             
if(i1==i2&&j1==j2)
               d[i1][j1][i2][j2]
+=a[i1][j1];
             
else d[i1][j1][i2][j2]+=a[i1][j1]+a[i2][j2];
          }

    fout
=fopen("message.out","w");
    fprintf(fout,
"%ld\n",d[m][n][m][n]);
    fclose(fout);
return 0;
}

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

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