• 四维动规 洛谷P1004方格取数


    分析:这个题因为数据量非常小,可以直接用四维的DP数组

    dp[i][j][k][l]表示第一个人走到位置(i,j),第二个人走到位置[k][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]

    注意,当两个人走到同一个位置时,因为数取走后就没了,是需要减去同时走过的位置(这一点是本题的重点,在dp状态转移的过程中,会把所有两个人走的重复的点都遍历出来,所以在最后最大的结果里,只要有过两个人都走过的位置,就会减去一次重复位置处的数值)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const double pi=acos(-1);
     5 const int inf=1<<30;
     6 int a[10][10];
     7 int dp[10][10][10][10];
     8 int main(){
     9     int n;scanf("%d",&n);
    10     int x,y,z;
    11     while(scanf("%d%d%d",&x,&y,&z)){
    12         if(!x&&!y&&!z) break;
    13         a[x][y]=z;
    14     }
    15     for(int i=1;i<=n;i++){
    16         for(int j=1;j<=n;j++){
    17             for(int k=1;k<=n;k++){
    18                 for(int l=1;l<=n;l++){
    19         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];
    20             if(i==k&&j==l) dp[i][j][k][l]-=a[i][j];
    21                 }
    22             }
    23         }
    24     }
    25     cout<<dp[n][n][n][n]<<endl;
    26     return 0;
    27 }
  • 相关阅读:
    UVA 12901 Refraction 折射 (物理)
    UVA 12898
    UVA 690 PipelineScheduling 位运算+dfs+剪枝
    UVA1602 Lattice Animals 网格动物 (暴力,STL)
    UVA 810 A Dicey Promblem 筛子难题 (暴力BFS+状态处理)
    UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
    UVA 536 TreeRocvery 树重建 (递归)
    二分查找
    OI记忆口诀
    OI经典语录
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/10197621.html
Copyright © 2020-2023  润新知