zoukankan      html  css  js  c++  java
  • LuoGu P1004 方格取数

    题目传送门
    一开始这个题我是不会的(沙华弱DP啊QwQ),后来考完试我一想,这东西怎么和数字三角形那题这么像啊?

    都是自上而下,只能向下或者向右,求一个max

    那么...这不就是个走两遍的数字矩阵嘛

    转移方向都没换:对于(i,j),只能由(i-1,j)或(i,j-1)转移过来

    转移解决了,那么状态怎么表示呢?

    考虑,一个人走两遍==两个人走一遍,对吧?

    那么用f[i][j][k][l]表示状态:第一个人位于(i,j)第二个人位于(k,l)时所能达到的最大数字和

    转移也有了:f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i][j-1][k-1][l],max(f[i-1][j][k][l-1],f[i][j-1][k][l-1])))+e[i][j]+e[k][l];

    不过,题目中有一个条件:一个数字不能被两次取走

    只需要转移的时候取判断一下两个人是否走到了同一个点,如果是,那么就减去一次该位置上的数字

    这样,这题就A掉了呢

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #define max(a,b) (a>b?a:b)
    
    using namespace std;
    
    const int N=11;
    
    int e[N][N],f[N][N][N][N],n,u,v,w;
    
    int main(){
     scanf("%d",&n);
     do{
      scanf("%d%d%d",&u,&v,&w);
      e[u][v]=w;
     }while(u!=0&&v!=0&&w!=0);
     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){
         f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i][j-1][k-1][l],max(f[i-1][j][k][l-1],f[i][j-1][k][l-1])))+e[i][j]+e[k][l];
         if(i==k&&j==l) f[i][j][k][l]-=e[i][j];
        }
     printf("%d
    ",f[n][n][n][n]);
     return 0;
    }
    
    
    May you return with a young heart after years of fighting.
  • 相关阅读:
    AESUtil_1
    ELK配置
    Centos7上安装docker
    Excel大批量数据导出
    Redis5.0.6安装完整步骤
    idea远程打断点
    [HNOI2016] 序列
    [TJOI2017] 异或和
    洛谷 P4933 大师
    洛谷 P1950 长方形_NOI导刊2009提高(2)
  • 原文地址:https://www.cnblogs.com/Equinox-Flower/p/9600587.html
Copyright © 2011-2022 走看看