方格取数 洛谷1004 dp

设有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表示输入结束。

输出格式:
只需输出一个整数,表示2条路径上取得的最大的和。

输入输出样例

输入样例#1:
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
输出样例#1:
67

如果只有一条路径的话相信大家都会做,但有的人看到要两条路就懵逼了。。。
其实完全无所谓,就让两个人一起走,然后如果两个人走到同一个点的话就特判一下,只加一次值就行了。

这就是个四维dp,看题目数据,n<=9,999*9 非常的小,完全就是秒过。。

dp[i][j][k][l] ,i j 用来推第一条路径,k l用来推第二条路径,其状态转移方程就是:
dp[i][j][k][l]=max(max(dp[i-1][j][k-1][l],dp[i][j-1][k][l-1]),max(dp[i-1][j][k][l-1],dp[i][j-1][k-1][l]))+a[i][j]+a[k][l];
if(i==k&&j==l)dp[i][j][k][l]-=a[i][j];

具体代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int n,dp[20][20][20][20],a[20][20],x,y,z;
int main(){
    cin>>n;
    while(1){
        cin>>x>>y>>z;
        if(x==0&&y==0&&z==0) break;
        else a[x][y]=z;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                for(int l=1;l<=n;l++){
                    int tmp1=max(dp[i-1][j][k-1][l],dp[i][j-1][k][l-1]);
                    int tmp2=max(dp[i-1][j][k][l-1],dp[i][j-1][k-1][l]);
                    dp[i][j][k][l]=max(tmp1,tmp2)+a[i][j];
                    if(i!=k&&j!=l) dp[i][j][k][l]+=a[k][l];
                 }
    cout<<dp[n][n][n][n]<<endl;
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 5,366评论 0 2
  • 昨晚迎接夏令营归来的儿子 十二点多才睡 今天一家人都起的晚 索性先练功 直接午饭 今早练完后 感冒全好了
    了了妈2017阅读 1,020评论 0 4
  • 提到兵马俑,我们想的是他历经千年,依旧栩栩如生,辉煌壮烈。 但是今天我说的是工作,如常所知,工作本就是朝九晚五的的...
    雀替阅读 3,449评论 0 0