现在的位置: 首页 > 综合 > 正文

方格取数——细节决定成败

2013年05月19日 ⁄ 综合 ⁄ 共 1128字 ⁄ 字号 评论关闭

我一向不相信这句话,但对于编程,这句话很适用。

转移方程:

f[k][i][j] =
max
{
f[k-1][i][j], f[k-1][I-1][j-1],f[k-1][I-1][j],f[k-1][I][j-1]

}

if(I!=j)

  f[k][i][j]=max +a[k-I+1][I]+a[k-j+1][j];

else

 f[k][i][j]=max+ a[k-I+1][I];

多进程动态规划。f[k][i][j]表示走了k步,第一条路向右走i步,第二条路向右走j步。

每条路的每个位置都可以从它的上方或左方得到,所以max{}里会有四个状态。还有

如果两条路走到了同一位置,那么该位置的数只加一次,这就是上面判断的必要性。

注意:起始位置也记为一步;最后不将a[k-I+1][I]和a[k-j+1][j]赋为0(题目很具有迷惑性)。

 

 

 

代码

1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4  int f[30][12][12],a[12][12];
5  int n;
6 FILE *in;
7
8 int main()
9 {
10 in=fopen("in.in","r");
11 int i,j,z,y,x,k,max;
12 memset(a,0,sizeof(a));
13 fscanf(in,"%d",&n);
14 fscanf(in,"%d%d%d",&x,&y,&z);
15 while(x+y+z!=0)
16 {
17 a[x][y]=z;
18 fscanf(in,"%d%d%d",&x,&y,&z);
19 }
20 memset(f,0,sizeof(f));
21 f[1][1][1]=a[1][1];
22 for(k=2;k<=2*n-1;k++)
23 for(i=1;i<=n;i++)
24 for(j=1;j<=n;j++)
25 if(j<=k&&i<=k&&k-i+1<=n&&k-j+1<=n)
26 {
27 max=-1;
28 max=f[k-1][i][j];
29 if(max<f[k-1][i-1][j-1])
30 max=f[k-1][i-1][j-1];
31 if(max<f[k-1][i-1][j])
32 max=f[k-1][i-1][j];
33 if(max<f[k-1][i][j-1])
34 max=f[k-1][i][j-1];
35 if(i==j)
36 f[k][i][j]=max+a[k-i+1][i];
37 else
38 f[k][i][j]=max+a[k-i+1][i]+a[k-j+1][j];
39 }
40 printf("%d\n",f[2*n-1][n][n]);
41 fclose(in);
42 return 0;
43 }

 

 

抱歉!评论已关闭.