zoukankan      html  css  js  c++  java
  • [多路dp]更难的矩阵取数问题

    https://www.51nod.com/tutorial/course.html#!courseId=11&isCurrent=1

    解题关键:1、注意i和j的最大取值都是n,k是i与j的和。

        2、空间卡的很紧,多一位都不行。

        转移方程:$dp[{x_1}][{y_1}][{x_2}][{y_2}] = max{ dp[{x_1}'][{y_1}'][{x_2}'][{y_2}']}  + a[{x_1}][{y_1}] + a[{x_2}][{y_2}]$

        通过观察,可以消去一个变量,从而

        $dp[k + 1][{x_1}][{x_2}] = max{ dp[k][{x_1}'][{x_2}']}  + a[{x_1}][{y_1}] + a[{x_2}][{y_2}]$

        然后再将相同的处理掉即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 int a[402][402];
     5 ll dp[402][201][201];
     6 int m,n;
     7 int main(){
     8     memset(dp,0,sizeof dp);
     9     scanf("%d%d",&m,&n);
    10     for(int i=1;i<=n;i++){
    11         for(int j=1;j<=m;j++){
    12             scanf("%d",&a[i][j]);
    13         }
    14     }
    15     for(int k=2;k<=n+m;k++){
    16         for(int i=1;i<=n&&k-i>=1;i++){
    17             for(int j=1;j<=n&&k-j>=1;j++){
    18                 dp[k][i][j]=max(dp[k][i][j],dp[k-1][i-1][j-1]+a[i][k-i]+(i==j?0:a[j][k-j]));
    19                 dp[k][i][j]=max(dp[k][i][j],dp[k-1][i][j-1]+a[i][k-i]+(i==j?0:a[j][k-j]));
    20                 dp[k][i][j]=max(dp[k][i][j],dp[k-1][i-1][j]+a[i][k-i]+(i==j?0:a[j][k-j]));
    21                 dp[k][i][j]=max(dp[k][i][j],dp[k-1][i][j]+a[i][k-i]+(i==j?0:a[j][k-j])); //可以以一个4元最大值函数结束。 
    22             }
    23         }
    24     }
    25     printf("%lld
    ",dp[n+m][n][n]);
    26     return 0;
    27 }
  • 相关阅读:
    装饰器详解
    面试题求 平衡点
    Python面试题
    With语句上下文管理
    多个装饰器修饰一个函数
    NGINX部署配置参考.
    Django ORM操作
    MYsql 之多表查询.
    [数据结构与算法] : 二叉查找树
    [数据结构与算法] : 队列
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6842975.html
Copyright © 2011-2022 走看看