定义

坐标型动态规划一般是给定网格、序列,求满足条件的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;
}

回顾复习之坐标DP的更多相关文章

  1. 第35天学习打卡(输入框 TextField监听 简易计算器,组合+内部类回顾复习 画笔 鼠标监听 窗口监听 键盘监听)

    1.输入框 TextField监听  package com.kuang.lesson02; ​ import java.awt.*; import java.awt.event.ActionEven ...

  2. 算法复习——状压dp

    状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达 ...

  3. 【题解】洛谷P1169 [ZJOI2007] 棋盘制作(坐标DP+悬线法)

    次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵 ...

  4. 复习1背包dp

    背包问题是对于一个有限制的容器,一般计算可以装的物品的价值最值或数量.通常每个物品都有两个属性空间和价值,有时还有数量或别的限制条件,这个因体而异. 背包大概分成3部分,下面会细述这最经典的3种题型 ...

  5. crawler 听课笔记 碎碎念 3 关于python的细枝末节的回顾复习

    和廖雪峰大神的教程学了几遍后,还是出现了许多不足,于是就做一些回顾,列出一些python的细节问题,有一些就提一下,如果发现不清楚的话 还请移步https://www.liaoxuefeng.com/ ...

  6. 第42节:Java知识点回顾复习

    Java介绍 Java是一门面向对象的程序设计的编程语言,在1995年,sun公司发布了Java这门编程语言,有咖啡的名称,是当时灵机一动的想法.在2010年的时候被Oracle公司收购了,目前jdk ...

  7. 【题解】洛谷P1373 小a和uim之大逃离(坐标DP)

    次元传送门:洛谷P1373 思路 设f[i][j][t][1/0]表示走到(i,j)时 小a减去uim的差值为t 当前是小a取(0) uim取(1) 那么转移就很明显了 f[i][j][t][]=(f ...

  8. 集训DP复习整理

    DP复习 集训%你赛2:测绘(审题DP) 经过2000+个小时的努力终于把这道题做出来的蒟蒻通 分析: 这道题我一直没做出来的原因就是因为我太蒟了题面看不懂,题面读懂了,其实不是特别难. 题目翻译: ...

  9. 四、Android学习第四天——JAVA基础回顾(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...

  10. Stm32之通用定时器复习

    因为毕业设计要用到PWM调光很久都没用到Stm32的定时器,有些内容已经遗忘,为了回顾复习相关内容今天开下通用定时器这一章节的数据手册. 1.时钟 通用定时器一般是TIM2~TIM5,TIM1.TIM ...

随机推荐

  1. spring boot 中默认最大线程连接数,线程池数配置查看

    本文为博主原创,转载请注明出处: 可以查看 AbstractEndpoint  源码中的常量的定义: public abstract class AbstractEndpoint<S, U> ...

  2. Clock Gating Design

    GPU max power distribution internal power and switch power - 动态功耗(时钟翻转) Leakage power - 漏电功耗(静态功耗,mo ...

  3. 如何取消VSCODE文件夹折叠

    1.问题 如图所示,文件夹折叠在一起,导致我无法在父文件夹中新建一个文件夹,而是只能在子文件夹中新建文件夹 2.解决 原因:文件夹以紧凑方式呈现,取消即可 1. 打开设置,在里面搜索Explorer: ...

  4. Go-错误栈信息

    Go中错误栈信息 .\main.go:22:2: number1 declared but not used .\main.go 错误发生的文件 22:2 文件的22行第2列 number1 decl ...

  5. 战略设计- DDD

    随着系统的增长,它会变得越来越复杂,当我们无法通过分析对象来理解系统的时候,就需要掌握一些操纵和理解大模型的技术了.本文将介绍一些原则.遵循这些原则,就可以对非常复杂的领域进行建模.大部分这样的决策都 ...

  6. Linux_sqlcmd或者是Cloudquery连接SQLSERVER2012的问题解决

    Linux_sqlcmd或者是Cloudquery连接SQLSERVER2012的问题解决 背景 最近想使用shell脚本给SQLServer数据库插入数据,但是发现了报错 同时进行CLoudquer ...

  7. [转帖]chrome历史版本及重大变化(维基百科)

    Google Chrome是Google LLC开发的免费 网络浏览器.开发过程分为不同的"发布渠道",每个发布渠道都在单独的开发阶段进行构建.Chrome提供了4种渠道:稳定版, ...

  8. [转帖]文件系统读写性能fio测试方法及参数详解

    简介 Fio 是一个 I/O 工具,用来对硬件进行压力测试和验证,磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类. Fio支持13种不同的I/O引擎,包括:sync, ...

  9. 在线获取所有依赖rpm包的方法

    背景 现在经常有一些不能上网的LInux机器但是需要安装一些软件. 但是有时候经常因为有依赖关系找不到的情况比较麻烦. 或者是一些公司的网络总是受限,网络速度非常慢. 下载安装非常折磨人. 这个时候就 ...

  10. Docker内JVM参数的简单学习

    Docker内JVM参数的简单学习 背景 公司内部有K8S的项目. 基于K8S内容器的JVM参数的设置与标准虚拟机运行不太一样. 产品内部的启动脚本有一个设置, 在内存大于16G的情况下 默认取内存总 ...