首页 > 其他分享 >回顾复习之坐标DP

回顾复习之坐标DP

时间:2024-02-17 20:33:39浏览次数:30  
标签:10 复习 个数 long 取数 DP int128 dp 坐标

定义

坐标型动态规划一般是给定网格、序列,求满足条件的MAX或MIN。
开数组时,dp[i]一般代表以ai结尾的满足条件的子序列,dp[i][j]代表以i、j结尾的满足条件的最优解

例题

数塔

典中典

变形

晴天小猪历险记之Hill
抓苹果
免费馅饼

矩阵取数

描述

传送门

思路

首先看出,每行的问题是独立的、互不影响,可以对每一行分别求解最高分,相加得出整个游戏的最高分。
就每一行而言,取数的顺序是有讲究的,先取的数的倍数较少,后取的数的倍数较大,因此要找到最优的取数方案。
我们设计动规的状态时,常设置状态为选取了前i个数,但这题的规则是每次从开头或者末尾取,这是差异,那怎么调整呢?应该回到动规性质上来考虑,状态设置的要求是无后效性,即之前的选择不影响之后的选择,当前的选择是过去的完整总结。不妨设想我们玩这个游戏玩到某一步时,我们已从行首取了3个数,从行尾取了5个数,还有中间10个数可以取,那接下来的游戏都是在这10个数中进行,跟之前的前3个、后5个已经没有关系了。这么思考很容易设计出:dp[i][j]表示选取了前i个数和后j个数。这里要注意的是,题目规则中的2阶乘加权是由取数的轮次决定的,这个次数只与i和j相关,不受之前所取数的影响,因此这个状态满足无后效性原则。又因为分数是一直简单累加的,所以当前最优解必然促成全局最优解,满足最优子结构性质。
状态转移比较容易构造,dp[i][j]由dp[i-1][j]或dp[i][j-1]转移而来,分别意味着选取了a[i]和选取了a[m+1-j]。dp[0][0]=0
dp[i][j]=max(2i+j *a[i]+dp[i-1][j],2i+j *a[m+1-j]+dp[i][j-1])
注意迭代的顺序,要按选取数量从小到大的顺序进行迭代,i、j循环须按从小到大顺序。

しかし(但是),让我们回看一下数据范围1≤n,m≤80,0≤ai,j≤10000,你有没有想到什么?
没错,\(\color{red}{\LARGE 高精度!}\) 这也是这道题的难点之一(我用的是__int128,以后会发文讲解)
好了,不多说了,上代码

code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define Elaina 0
const int N=105;
long long n,m,a[N][N];
__int128 ans=0,dp[N][N][N];
void print(__int128 x){
	if(x>9)print(x/10);
	putchar(x%10+'0');
}
void read(__int128 &res){
	char scan[1005];
	res=0;
	cin>>scan;
	for(int i=0;i<strlen(scan);i++){
		res=res*10+scan[i]-'0';
	}
} 
void DP(){
	for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            dp[i][j][j]=a[i][j]*2;
    for(int i=1;i<=n;++i){
        for(int len=2;len<=m;++len){
            for(int l=1;l+len-1<=m;++l){
                int r=l+len-1;
                dp[i][l][r]=max(dp[i][l][r],max(dp[i][l][r-1]*2+a[i][r]*2,dp[i][l+1][r]*2+a[i][l]*2));
            }
        }
        ans += dp[i][1][m];
    }	
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
        	cin>>a[i][j]; 
	DP();
	print(ans);
	return Elaina;
} 

标签:10,复习,个数,long,取数,DP,int128,dp,坐标
From: https://www.cnblogs.com/Elaina-0/p/18018316

相关文章

  • 动态规划(五)——坐标dp
    传纸条题目描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小......
  • DP总结
    DP总结DP(动态规划)简介动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。由于动态规划并**不是某种具体的算法**,而是一种解决特定问题的方法,因此它会出现在各式各样的数据结构中,与之相关的题目种类也更为繁杂。DP基础1.必要前提 需要满足三个......
  • 区间dp
    Ø合并:意思就是将两个或多个部分进行整合,当然也可以反过来,也就是是将一个问题进行分解成两个或多个部分。Ø特征:能将问题分解成为两两合并的形式Ø求解:对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优值。有点类......
  • 区间dp
    合并类动态规划合并:意思就是将两个或多个部分进行整合,当然也可以反过来,也就是是将一个问题进行分解成两个或多个部分。特征:能将问题分解成为两两合并的形式求解:对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优......
  • 区间dp
    1.合并石子(1)排成一列的石子这个与合并果子唯一的不同就是只能合并相邻的石子,所以贪不得(怎么所有类型的动规要先上来搞贪心,有点diss贪心的感觉)f[i][j]表示i到j间合并的最大/最小得分;核心for(intlen=2;len<=n;len++){//表示长度2到len时的最大 for(inti=1;i+len-1<=n;i++)......
  • 背包dp
    01背包描述:有n个物品,每个物品只有一件,第i个物品体积为vi,价格为ci。现在有一个体积为V的背包,请你从n件物品里选出若干件放进背包里,使得背包里的物品价值最大。思路:01背包的特点是:每种物品只有一件,可以选择放或不放。我们可以根据此特点进行动态规划(DP),设f[i][j]表示前i件物品放......
  • 动态规划-DP 完整版
    动态规划学完了五大基础dp做个简单总结dp特征动态规划问题首要是找到做题的目的是求最大/小值还是其他;其二要确定问题的状态转移方程这是关键;第三为dp数组找到边界、最后检查是否需要结合其他相关知识如树dfs等;别忘了检查多测输入数组变量置零等易错点。......
  • 线性dp
    线性动态规划:不用多说,主要应用于求上升子序列,下降子序列等直接看例题:样例输入:13791638243718441921226315样例输出:max=879161819212263解:#include<bits/stdc++.h>usingnamespacestd;constintMAX=1050;intn,ans;intf[MAX],......
  • DP总结
    DP总结1.背包DP-0/1背包-完全背包-多重背包-分组背包-依赖背包-二维背包-树形背包DP0/1背包朴素版点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1010;//f[i][j]表示前i个物品,体积不超过j时的最大价值//不选第i个物品时,f[i][j]......
  • 回顾复习之线性DP
    概念具有线性阶段划分的动态规划算法叫作线性动态规划(简称线性DP)。若状态包含多个维度,则每个维度都是线性划分的阶段,也属于线性DP,如下图所示:如果状态包含多个维度,但是每个维度上都是线性划分的阶段,也属于线性DP。比如背包问题、区间DP、数位DP等都属于线性DP。例题求最......