动态规划---区间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 ...
随机推荐
- html5——全屏显示
基本概念 1.HTML5规范允许用户自定义网页上任一元素全屏显示 2.requestFullscreen() 开启全屏显示.cancleFullscreen() 关闭全屏显示 3.不同浏览器兼容性不一 ...
- 扩增子图表解读1箱线图:Alpha多样性
箱线图 箱形图(Box-plot)又称为盒须图.盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图.因形状如箱子而得名.在宏基因组领域,常用于展示样品组中各样品Alpha多样性的分布 第一种情 ...
- ESLint =》tslint.json
结论:将ESLint提示注意()里面的规则属性在tslint.json中"rules": { } 里设置为false 1.ES6: ESLint提示"Require Ob ...
- Python 索引切片
#负数开头,只有比负数大才有数据 num = [1,2,3,4,5,6,7,8,9,10] print(num[-5:5]) num = [1,2,3,4,5,6,7,8,9,10] print(nu ...
- MySQL之索引以及正确使用索引
一.MySQL中常见索引类型 普通索引:仅加速查询 主键索引:加速查询.列值唯一.表中只有一个(不可有null) 唯一索引:加速查询.列值唯一(可以有null) 组合索引:多列值组成一个索引,专门用于 ...
- 《零压力学Python》 之 第一章知识点归纳
第一章(初识Python)知识点归纳 Python是从ABC语言衍生而来的 ABC语言是Guido参与设计的一种教学语言,为非专业编程人员所开发的. Python是荷兰程序员 Guido Van Ro ...
- padding填充与box-sizing: border-box配合使用
不管伸缩盒还是浮动盒子,只要使用到padding,就必须使用 box-sizing: border-box; 有图片的时候,需摇与其他文字对齐的时候,在图片的外层加个:vertical-ali ...
- 【codeforces 755F】PolandBall and Gifts
[题目链接]:http://codeforces.com/contest/755/problem/F [题意] n个人; 计划是每个人都拿一个礼物来送给一个除了自己之外的人; 且如果一个人没有送出礼物 ...
- 洛谷 P1843 奶牛晒衣服
题目背景 熊大妈决定给每个牛宝宝都穿上可爱的婴儿装 . 于是 , 为牛宝宝洗晒衣服就成了很不爽的事情. 题目描述 熊大妈请你帮助完成这个重任 . 洗完衣服后 , 你就要弄干衣服 . 衣服在自然条件下用 ...
- 【Developer Log】ProGuard扰码可执行JAR包
在项目上线之前需要通过ProGuard来对java的class进行混淆,以避免反编译方式,来保护自己的代码.ProGuard网上有很多资料,可以参考:http://blog.csdn.net/zhan ...