zoukankan      html  css  js  c++  java
  • P1004 方格取数(四维dp)

     

    经典dp问题,dp[i][j][k][l],i、j代表第一个人的位置,k、l代表第二个人的位置,则列出dp方程,dp[i][j][k][l]=max(dp[i-1][j][k][l-1],dp[i-1][j][k-1][l],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]);

    特判一下两个人在同一个位置只能取一个数字。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=12;
    int dp[maxn][maxn][maxn][maxn];
    int a[maxn][maxn];
    int n,v1,v2,v3;
    int main()
    {
        cin>>n>>v1>>v2>>v3;
        while(v1!=0&&v2!=0&&v3!=0){
            a[v1][v2]=v3;
            cin>>v1>>v2>>v3;
        }
        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++){
                        dp[i][j][k][l]=max(dp[i-1][j][k-1][l],max(dp[i-1][j][k][l-1],max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])))+a[i][j]+a[k][l];
                        if(i==k&&j==l)dp[i][j][k][l]-=a[i][j];
                    }
                }
            }
        }
        cout<<dp[n][n][n][n]<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    加分二叉树
    香甜的黄油 Sweet Butter
    09.22今日暂时停更题解
    能量项链
    转圈游戏
    字串变换
    关押罪犯
    选择客栈
    神经网络
    未整理算法的总结
  • 原文地址:https://www.cnblogs.com/mohari/p/12936366.html
Copyright © 2011-2022 走看看