NOIP2000方格取数
题目描述
设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):
某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。
输入
输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。
输出
只需输出一个整数,表示2条路径上取得的最大的和。
样例输入
8 2 3 13 2 6 6 3 5 7 4 4 14 5 2 21 5 6 4 6 3 15 7 2 14 0 0 0
样例输出
67
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include<iostream> using namespace std; int a[11][11]; int f[11][11][20]; int main() { int n; int a1,a2,a3; cin>>n; while(cin>>a1>>a2>>a3) { if(a1==0)break; a[a1][a2]=a3; } f[1][1][1]=a[1][1]; for(int i=2;i<n*2;i++) for(int j=1;j<=i&&j<=n;j++) for(int k=1;k<=i&&k<=n;k++) { f[j][k][i]=max(f[j][k][i],f[j][k][i-1]); f[j][k][i]=max(f[j][k][i],f[j-1][k-1][i-1]); f[j][k][i]=max(f[j][k][i],f[j-1][k][i-1]); f[j][k][i]=max(f[j][k][i],f[j][k-1][i-1]); if(j==k)f[j][k][i]=f[j][k][i]+a[j][i-j+1]; else f[j][k][i]=f[j][k][i]+a[j][i-j+1]+a[k][i-k+1]; } cout<<f[n][n][2*n-1];//这个就是最大值,如在过程中每次比较得出最大值反而是错的 return 0; } |
Subscribe