5103 传纸条 0x50「动态规划」例题
描述
给定一个 N*M 的矩阵A,每个格子中有一个整数。现在需要找到两条从左上角 (1,1) 到右下角 (N,M) 的路径,路径上的每一步只能向右或向下走。路径经过的格子中的数会被取走。两条路径不能经过同一个格子。求取得的数之和最大是多少。N,M≤50。
输入格式
第一行有2个用空格隔开的整数n和m,表示有n行m列(1<=n,m<=50)。
接下来的n行是一个n*m的矩阵,每行的n个整数之间用空格隔开。
输出格式
一个整数,表示答案。
样例输入
3 3
0 3 9
2 8 5
5 7 0
样例输出
34
数据范围与约定
- 30%的数据满足:1<=m,n<=10
100%的数据满足:1<=m,n<=50
来源
CCF NOIP2008 T3
题意:n*m的格子里每个格子有一个权值,从(1,1)走到(n,m)两条路,(只能向下或者向右)求路径之和。走过的格子只算一次权值。
思路:
把“路径长度”即当前走过的步数作为DP的“阶段”。【因为只能向下或向右,走到(n,m)时的路径长度是n+m-2】
每一个阶段中,把两条路径同时扩展一步,路径长度增加1,从而转移到下一个阶段。
还需确定两条路径当前的末尾位置。并且 x1+y1 = x2 + y2 = i + 2
所以就可以用三维dp维护,每次有4种扩展方式。并且要考虑扩展后是否两个点坐标相同。
目标是dp[n+m-2][n][n]
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include