蓝桥杯 方格取数 (多线程DP)
2015-12-21 17:38
316 查看
算法训练 方格取数
时间限制:1.0s 内存限制:256.0MB
问题描述
设有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.0s 内存限制:256.0MB
问题描述
设有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
/* 解题思路: 多线程同时dp 当做两个人同时在矩阵上走 x1,y1 x2 y2 dp[x1][y1][x2][y2] 2*2=4种情况 如果x1==x2&&y1==y2 证明此时在一起 只能加1次 */ #include <iostream> #include <string.h> #include <cstdio> using namespace std; int main(){ int n; cin>>n; int map[11][11]; int dp[11][11][11][11]; memset(dp,0,sizeof(dp)); memset(map,0,sizeof(map)); int a,b,c; while(cin>>a>>b>>c){ if(a==0&&b==0&&c==0) break; map[a][b]=c; } int x1,x2,y1,y2; for(x1=1;x1<=n;x1++) for(y1=1;y1<=n;y1++) for(x2=1;x2<=n;x2++) for(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]+=map[x1][y1]; if(x1==x2&&y1==y2) continue; dp[x1][y1][x2][y2]+=map[x2][y2]; } cout<<dp <<endl; return 0; }
相关文章推荐
- project euler 92
- SpannableString的一些api
- 简单的网络数据用文件来缓存
- 用管道实现线程驱动和通信
- 对apk进行加密
- Linux系统apache2.4环境下php7.0.0的源码安装
- metasploit--payload模块信息
- Unity3D Animation Curve
- 老李分享:《Java Performance》笔记1——性能分析基础 1
- Oozie中Shell action的配置及应用
- JPA 中使用@Where
- Oozie中Sqoop的配置及应用
- tcpdump静态编译
- project euler 91
- bash 的组数(array)处理方法
- Android BackgroundViewPager:类似桌面背景壁纸随手指滑动
- scala-43:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析
- 性能计数器进行性能分析
- 老李分享:jvm结构简介 2
- bootstrap中的网格系统