• [NOIP2008] 传纸条


    题意:

    传送门

    题解:

    dp

    可以看做是从起点出发走两条不同的路径到终点,设dp[i][j][k][l],注意两个点(即前两维和后两维)要同时转移才能保证不走重复路径

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define ll long long
    #define N 52
    using namespace std;
    
    int n,m;
    int dp[N][N][N][N],a[N][N];
    
    int gi() {
      int x=0,o=1; char ch=getchar();
      while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
      if(ch=='-') o=-1,ch=getchar();
      while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
      return o*x;
    }
    
    int main() {
      n=gi(),m=gi();
      for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
          a[i][j]=gi();
      for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) 
          for(int k=1; k<=n; k++)
            for(int l=1; l<=m; l++) 
            if(i!=k && j!=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[n][m][n][m]=max(dp[n-1][m][n-1][m],max(dp[n-1][m][n][m-1],max(dp[n][m-1][n-1][m],dp[n][m-1][n][m-1])));
      printf("%d
    ", dp[n][m][n][m]);
      return 0;
    }
    
  • 相关阅读:
    VS.net 2005快捷键一览表
    POJ 1141 Brackets Sequence
    POJ 3264 Balanced Lineup RMQ问题的ST解法
    Hdu 4267 A Simple Problem with Integers
    hdu 4009 Transfer water
    HDU 4288 Coder
    POJ 1679 The Unique MST
    hdu 4291 A Short problem
    hdu 1175 连连看(DFS)
    POJ 3164 Command Network
  • 原文地址:https://www.cnblogs.com/HLXZZ/p/7670083.html
Copyright © 2020-2023  润新知