[NOIP提高组2000]方格取数
来源:互联网 发布:js 垃圾回收机制 编辑:程序博客网 时间:2024/06/05 09:14
【问题描述】
设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):
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
某人从图的左上角的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
题解:
第一眼想到dfs,太水懒得写。
然后发现有个更好打的DP
f[i][j][u][v]表示从st出发的两条路,一条到了i,j,另一条到了u,v
状态转移详见代码。
#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int n;int map[20][20];int f[20][20][20][20];int main(){ scanf("%d",&n); while(1) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a==0&&b==0&&c==0) break; map[a][b]=c; } f[1][1][1][1]=map[1][1]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int u=1;u<=n;u++) { for(int v=1;v<=n;v++) { f[i][j][u][v]=max(f[i-1][j][u-1][v],max(f[i][j-1][u-1][v],max(f[i-1][j][u][v-1],f[i][j-1][u][v-1]))); f[i][j][u][v]+=map[i][j]+map[u][v]; if(i==u&&j==v) f[i][j][u][v]-=map[i][j]; } } } } printf("%d",f[n][n][n][n]);}
- [NOIP提高组2000]方格取数
- [NOIP提高组2000]方格取数
- Noip 2000 方格取数
- 2000年NOIP全国联赛提高组 方格取数 题解
- Codevs 1169 传纸条/1043 方格取数 2008/2000年NOIP全国联赛提高组 多线程dp
- luogu1004 【2000提高】方格取数(dp)
- NOIP 2000 方格取数 2008传纸条
- NOIP2000提高组 4.方格取数 C语言题解
- noip2000提高组——方格取数
- NOIP 2000 方格取数 NOIP 2008 传纸条 多线程DP
- (ssl1010)P1004 2000年分区联赛提高组之四 方格取数
- 2000年分区联赛提高组之四 方格取数
- 【动态规划】Vijos P1143 三取方格数(NOIP2000提高组)
- 2000年分区联赛提高组之四 方格取数+2008年分区联赛提高组第三题 传纸条
- 【NOIP提高组】数格子
- 方格取数(1)
- 方格取数(2)
- 关于方格取数
- CMakeList配置之编译多个.cpp文件
- COOKIE和SESSION有什么区别?
- 面试题5:从尾到头打印链表
- java 泛型的一些理解
- 开源大数据分析工具!
- [NOIP提高组2000]方格取数
- [数据库与SQL]
- 我的博客起始–纵览
- Hdu6090 Rikka with Graph(2017多校第5场)
- 文章标题
- Android绘制Paint学习笔记
- JZOJ 5231 序列问题
- 防止浏览器记住用户名及密码的简单实用方法
- 大数据统计分析架构-netty部分