蓝桥杯 算法训练 方格取数 By Assassin [多线程dp]
2017-03-20 11:17
204 查看
问题描述 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下角的B点(N,N)。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字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,1)到(n,n)而且只能是向下向右走,说明假如有两个人走,那次两个人同时走一步,那么两个人是不可能不同时到达某点(x,y)的,比如说两人从(1,1)到达(2,2),一定是同时的,这样就保证了多线程dp的可行性。
直接看代码吧!
#include<bits/stdc++.h> using namespace std; int dp[11][11][11][11]={0}; int mapp[11][11]={0}; int n; int dp_go(int x1,int y1,int x2,int y2){ if(x1==x2&&y1==y2){ return mapp[x1][y1]; } else{ return mapp[x1][y1]+mapp[x2][y2]; } } int main(){ int temp1,temp2,pos; scanf("%d",&n); while(1){ scanf("%d%d%d",&temp1,&temp2,&pos); if(temp1==0&&temp2==0&&pos==0) break; mapp[temp1][temp2]=pos; } for(int x1=1;x1<=n;x1++){ for(int y1=1;y1<=n;y1++){ for(int x2=1;x2<=n;x2++){ for(int y2=1;y2<=n;y2++){ dp[x1][y1][x2][y2] = max(max(dp[x1-1][y1][x2-1][y2], dp[x1-1][y1][x2][y2-1]), max(dp[x1][y1-1][x2-1][y2],dp[x1][y1-1][x2][y2-1])); dp[x1][y1][x2][y2]+=dp_go(x1,y1,x2,y2); } } } } cout<<dp <<endl; return 0; }
相关文章推荐
- 蓝桥杯--算法训练 方格取数(多线程dp)
- 算法训练 方格取数 蓝桥杯
- 蓝桥杯 ALGO-101 算法训练 图形显示
- 蓝桥杯 算法训练 黑色星期五
- 蓝桥杯——算法训练 大小写转换
- 蓝桥杯 ALGO-118 算法训练 连续正整数的和
- 蓝桥杯_算法训练_安慰奶牛(用Kruskal、Prim算法分别实现)
- 蓝桥杯 算法训练 最短路 [ 最短路 bellman ]
- 蓝桥杯 ALGO-129 算法训练 特殊的数字四十
- 蓝桥杯 算法训练 友好数
- 蓝桥杯 alo-157 算法训练 阶乘末尾
- 2016蓝桥杯算法训练——Anagrams问题
- 蓝桥杯ALGO-113——算法训练 数的统计
- 蓝桥杯 算法训练 黑白无常
- 蓝桥杯 算法训练 大小写转换
- 蓝桥杯习题集_ 算法训练 寻找数组中最大值
- 蓝桥杯习题集_ 算法训练 矩阵乘法
- 蓝桥杯习题集_ 算法训练 出现次数最多的整数
- 蓝桥杯 - 算法训练 - ALGO - 6 安慰奶牛(克鲁斯卡尔)
- 蓝桥杯 算法训练 黑色星期五