传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角。当然,迷宫中的通路不是平坦的,到处都是陷阱。Dr.Kong决定让他的机器人卡多去探险。
但机器人卡多从左上角走到右下角时,只会向下走或者向右走。从右下角往回走到左上角时,只会向上走或者向左走,而且卡多不走回头路。(即:一个点最多经过一次)。当然卡多顺手也拿走沿路的每个宝物。
Dr.Kong希望他的机器人卡多尽量多地带出宝物。请你编写程序,帮助Dr.Kong计算一下,卡多最多能带出多少宝物。2 2 3 0 10 10 10 10 80 3 3 0 3 9 2 8 5 5 7 100
120 134
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int d[105][52][52],a[52][52]; 6 int main() 7 { 8 int x,i,j,k,t; 9 int n,m; 10 scanf("%d",&x); 11 while(x--) 12 { 13 scanf("%d%d",&n,&m); 14 memset(d,0,sizeof(d)); 15 for(i=1;i<=n;++i) 16 for(j=1;j<=m;++j) 17 scanf("%d",&a[i][j]); 18 for(k=3;k<n+m;k++) 19 for(i=1;i<=n;++i) 20 for(j=i+1;j<=n;++j) //两条线 一定是一条比两一条的 横坐标要大 21 { 22 if(k-i<1||k-j<1) //有x+y=k知 y=k-x 故此处控制 列y的范围,下面同理 23 break; 24 if(k-i>m||k-j>m) 25 continue; 26 d[k][i][j] = max(max(d[k-1][i-1][j],d[k-1][i-1][j-1]),max(d[k-1][i][j-1],d[k-1][i][j])); 27 //此处是5维的3维简略版,i和j不是坐标,而是两个移动坐标的 横坐标,由于纵坐标与横坐标是 28 //线性函数关系,故可以省略。 29 d[k][i][j] +=a[i][k-i]+a[j][k-j]; 30 } 31 t=n+m; 32 d[t][n][n] = max(max(d[t-1][n-1][n],d[t-1][n-1][n-1]),max(d[t-1][n][n-1],d[n-1][n][n])); 33 printf("%d\n",d[t][n][n]+a[n][m]); 34 } 35 return 0; 36 } 37
ny712 探寻宝藏 ny61 传纸条(1),布布扣,bubuko.com
原文:http://www.cnblogs.com/lovychen/p/3614443.html