合肥网站建设推广,企业微信crm,个人网站赚广告费,深圳装饰公司网站【题目描述】
设有 NN 的方格图 (N≤9)#xff0c;我们将其中的某些方格中填入正整数#xff0c;而其他的方格中则放入数字 0。如下图所示#xff08;见样例#xff09;: A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0…【题目描述】
设有 N×N 的方格图 (N≤9)我们将其中的某些方格中填入正整数而其他的方格中则放入数字 0。如下图所示见样例: A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4 0 0 0 0 15 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 B
某人从图的左上角的 A 点出发可以向下行走也可以向右走直到到达右下角的 B 点。在走过的路上他可以取走方格中的数取走后的方格中将变为数字 0。
此人从 A 点到 B 点共走两次试找出 2 条这样的路径使得取得的数之和为最大。
【输入】
输入的第一行为一个整数 N表示 N×N 的方格图接下来的每行有三个整数前两个表示位置第三个数为该位置上所放的数。一行单独的 0 表示输入结束。
【输出】
只需输出一个整数表示 22 条路径上取得的最大的和。 样例输入 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 解题思路
这个题目首先可能会想到用动态二维 dp 解题但是会出现一个问题这个不像搜索走到之后就直接标记然后后面是不会走到了动态规划解题的特点是如果要得到最小值或者就不停的遍历并更新 dp 数组里面的值。但是这个题需要走两遍而且走过的路上的数字要清空注意这里并不是不能经过。
用一个四维 dp 数组解决四层循环查找一遍就可以得到答案。
代码如下
#includestdio.h
int book[10][10];
int dp[10][10][10][10];//四维动态 dp数组
int max(int x,int y)//求较大值的函数
{if(xy)return y;elsereturn x;
}
int main()
{int n,a,b,c,i,j,l,k;scanf(%d,n);while(scanf(%d %d %d,a,b,c)!EOF){if(a0b0c0)//一行单独的 0代表输入结束 break;book[a][b]c;}for(i1;in;i){for(j1;jn;j){for(l1;ln;l){for(k1;kn;k){dp[i][j][l][k]book[i][j]book[l][k]max(max(dp[i][j-1][l][k-1],dp[i-1][j][l-1][k]),max(dp[i-1][j][l][k-1],dp[i][j-1][l-1][k]));if(iljk)dp[i][j][l][k]-book[i][j];}} }}printf(%d\n,dp[n][n][n][n]);return 0;
} 这个方法应该也是可行的除了动态 dp 数组除了存放方格中数的 book 数组再设置一个 flag 数组只能向下走或者向右走它的下标代表每一列经过的行数每更新一次 dp 数组里面的值就把行数的下标存入对应的 flag 数组。
这样进行完第一遍查找后找到了方格取数的最大值并且标记了走过的路径接下来把走过的路径上面的方格数归为 0然后进行第二遍查找。
两遍查找的最大值相加就是要求的答案。