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

    题目链接:https://www.luogu.org/problemnew/show/P1004

    思路:

      这道题是四维DP的模板题,与luoguP1006传纸条基本相似,用f[i][j][k][l]表示第一个人走到(i,j),第二个人走到(k,l)时两个人取得数的和的最大值。显然复杂度最多为9×9×9×9=6561,所以这个方法可行。

      状态转移方程为:f[i][j][k][l]=max(f[i][j-1][k][l-1],max(f[i][j-1][k-1][l],max(f[i-1][j][k][l-1],f[i-1][j][k-1][l])))+a[i][j]+a[k][l];
      其中需要注意(i,j)与(k,l)重合的情况。

    AC代码如下:

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 int n;
     6 int a[12][12],f[12][12][12][12];
     7 
     8 int main(){
     9     scanf("%d",&n);
    10     int r,c,val;
    11     while(scanf("%d%d%d",&r,&c,&val)!=EOF&&r)
    12         a[r][c]=val;
    13     for(int i=1;i<=n;i++)
    14         for(int j=1;j<=n;j++)
    15             for(int k=1;k<=n;k++)
    16                 for(int l=1;l<=n;l++){
    17                     f[i][j][k][l]=max(f[i][j-1][k][l-1],max(f[i][j-1][k-1][l],max(f[i-1][j][k][l-1],f[i-1][j][k-1][l])))+a[i][j]+a[k][l];
    18                     if(i==k&&j==l)
    19                         f[i][j][k][l]-=a[i][j];
    20                 }
    21     printf("%d
    ",f[n][n][n][n]);
    22     return 0;
    23 }
  • 相关阅读:
    Length of Last Word
    Remove Duplicates from Sorted Array II
    Sum Root to Leaf Numbers
    Valid Parentheses
    Set Matrix Zeroes
    Symmetric Tree
    Unique Binary Search Trees
    110Balanced Binary Tree
    Match:Blue Jeans(POJ 3080)
    Match:Seek the Name, Seek the Fame(POJ 2752)
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10329971.html
Copyright © 2011-2022 走看看