动态规划---区间dp
今天写内网题,连着写了两道区间dp,这里就总结一下。
区间dp思想主要是先枚举f[i][j]中的i,再枚举j,再枚举一个1~j之间的变量k,一般是f[i][j] = max(f[i][j],f[i][k] + f[k][j]);(石子合并)
但是今天遇到的两个都不是这样的。
第一题,复制书稿,洛谷P1282。猜到是区间dp了,但是没写出来。后来看了一下,f[i][j]代表前i个人写到j本书,枚举k为第i个人从第k本书开始写。这样转移方程就很好想了。f[i][j] = min(f[i][j],max(f[i - 1][l],a[l - 1] + a[l] + a[l + 1] + ... + a[j]),这样复杂度有点高,所以后半部分用前缀和来维护就行了。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int f[][];
int a[],m,n,sum[];
void print(int x, int Ans)
{
if(!x) return;
for(int i=x; i>=; i--)
{
if(sum[x] - sum[i-] > Ans || !i)
{
print(i, Ans);
printf("%d %d\n", i+, x);
break;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++)
{
scanf("%d",&a[i]);
}
memset(f,,sizeof(f));
for(int i = ; i <= n; i++)
sum[i] = sum[i - ] + a[i],f[][i] = sum[i];
for(int i = ; i <= m; i++)
{
for(int j = i; j <= n; j++)
{
for(int l = i; l <= j; l++)
{
f[i][j] = min(f[i][j],max(f[i - ][l - ],sum[j] - sum[l - ]));
}
}
}
print(n,f[m][n]);
return ;
}
/*
9 3
1 2 3 4 5 6 7 8 9
*/
第二题,机器分配,到现在我也不知道为什么是区间dp,但是也只能硬着头皮写了。
第一次,想正常思路,f[i][j]代表i个公司分配j个机器。中间枚举第i个公司分配k个机器。但是貌似过不去,只能的90,因为要按照字典序输出。这个题需要倒着枚举。
#include<cstdio>
#include<iostream>
using namespace std;
int f[][],path[][][];
int num[][],n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i = ;i <= n;i++)
{
for(int j = ;j <= m;j++)
scanf("%d",&num[i][j]);
}
for(int i = ;i <= n;i++)
{
for(int j = ;j <= m;j++)
{
for(int k = ;k <= j;k++)
{
if(f[i - ][j - k] + num[i][k] > f[i][j])
{
f[i][j] = f[i - ][j - k] + num[i][k];
for(int h = ;h < i;h++)
path[i][j][h] = path[i - ][j - k][h];
path[i][j][i] = k;
}
}
}
}
cout<<f[n][m]<<endl;
for(int i = ;i <= n;i++)
{
cout<<i<<" "<<path[n][m][i]<<endl;
}
return ;
}
倒着枚举就是f[i][j]代表i各公司不给j个,然后就好了。
#include<cstdio>
#include<iostream>
using namespace std;
int f[][],path[][][];
int num[][],n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i = ;i <= n;i++)
{
for(int j = ;j <= m;j++)
scanf("%d",&num[i][j]);
}
for(int i = ;i <= n;i++)
{
for(int j = ;j <= m;j++)
{
for(int k = ;k <= j;k++)
{
if(f[i - ][k] + num[i][j - k] > f[i][j])
{
f[i][j] = f[i - ][k] + num[i][j - k];
for(int h = ;h < i;h++)
path[i][j][h] = path[i - ][k][h];
path[i][j][i] = j - k;
}
}
}
}
cout<<f[n][m]<<endl;
for(int i = ;i <= n;i++)
{
cout<<i<<" "<<path[n][m][i]<<endl;
}
return ;
}
动态规划---区间dp的更多相关文章
- 动态规划——区间dp
在利用动态规划解决的一些实际问题当中,一类是基于区间上进行的,总的来说,这种区间dp是属于线性dp的一种.但是我们为了更好的分类,这里仍将其单独拿出进行分析讨论. 让我们结合一个题目开始对区间dp的探 ...
- 动态规划——区间DP,计数类DP,数位统计DP
本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...
- 模板 - 动态规划 - 区间dp
因为昨天在Codeforces上设计的区间dp错了(错过了上紫的机会),觉得很难受.看看学长好像也有学,就不用看别的神犇的了. 区间dp处理环的时候可以把序列延长一倍. 下面是 $O(n^3)$ 的朴 ...
- [hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法
今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相 ...
- Hdu OJ 5115 Dire Wolf (2014ACM/ICPC亚洲区北京站) (动态规划-区间dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:前面有n头狼并列排成一排, 每一头狼都有两个属性--基础攻击力和buff加成, 每一头 ...
- Light OJ 1025 - The Specials Menu(动态规划-区间dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1025 题目大意:一串字符, 通过删除其中一些字符, 能够使这串字符变成回文串. ...
- [SCOI2007]压缩(动态规划,区间dp,字符串哈希)
[SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...
- [jdoj1090]矩阵_区间dp
矩阵 jdoj-1910 题目大意:给你连续的n个矩阵的长和宽,保证每连续的两个相邻矩阵满足相乘的条件,不能改变题目中矩阵的位置,求将这些矩阵相乘为一个矩阵的最小乘法次数. 注释:1<=n< ...
- 动态规划(区间DP):HDU 5115 Dire Wolf
Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if not ...
随机推荐
- 解决springmvc返回json中文乱码
在pringmvc中通过设置@ResponseBody返回json乱码问题,这个问题上网找了很久,发现答案真是人云亦云,奉上我的解决方案: 解决方案一:需要导入 jackson-core-asl-1. ...
- docker安装后出现Cannot connect to the Docker daemon
启动docker service docker start docker安装后出现Cannot connect to the Docker daemon You need to add user in ...
- 本地运行项目成功 ,但在服务器运行程序就会报Failed to establish a new connection: [Errno -2] Name or service not known
equests.exceptions.ConnectionError: HTTPSConnectionPool(host=): Max retries exceeded with url: /appa ...
- Python之进程 基础知识 上
阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multiprocess模块 进程的创建和mu ...
- 谷歌通过ajax获取本地JSON文件,为什么会提示跨域?
在本地写了一段JSON代码,然后用ajax读取后,在浏览器打开,发现谷歌提示涉及到跨域问题, 但是跨域是由于协议,域名,端口中有一个不同,才会跨域,我在本地访问自己的文件,怎么和跨域扯上关系了?? 下 ...
- 云计算时代,你为什么一定要学Linux?
云计算早已不是什么稀奇的概念,它的火爆让Linux运维工程师这个职业越来越重要.在当今各类云平台提供的系统中,Linux系统几乎毫无争议的独占鳌头,市场份额进一步扩张. 这也让Linux运维工程师职位 ...
- mysql跟java时间类型转换
参照这个就行了,这个对应注入类型.===========java注入数据库==========java类型 mysql类型 成功与否date date yesdate time nodate time ...
- Self-Attetion
四.self-attention 1.是什么? attention机制通常用在encode与decode之间,但是self-attention则是输入序列与输出序列相同,寻找序列内部元素的关系即 K= ...
- 找零钱的算法实现(Java)
简单的算法 基本思路就是将面值从大到小统计(外循环), 若当前金额大于某面值, 则当前金额减掉该面值, 并将面值对应张数+1, 继续往下判断(内循环) public void Change(int m ...
- 敏捷开发系列学习总结(5)——这几招搞定团队协同Coding
一个团队在一起Coding时,就怕发生这样的事情:同1个文件你改了,我也改了,他也改了,最后怎么同步呢?以前用clearcase时,A把文件checkout了,其他人就不能提交,保证了代码的唯一性.但 ...