2017北京赛区J题
类型:三维动态规划
题意:
合并连续石头块,最终要合并成一块,求时间最短,每次只能连续合并L~R块石头,不能合并成一块时输出-1
题解:
- 利用动态规划解决两种分问题
- dp[l][r][k]:表示在区间l到r之间分成k堆石头的最小代价
- 当k=1时,转移方程为:dp[l][r][1]=min(dp[l][r][1],dp[l][i][x-1]+dp[i+1][r][1]+sum[l][r]);
- 当k>=2时,转移方程为:dp[l][r][k]=min(dp[l][r][k],dp[l][i][k-1]+dp[i+1][r][1]);
- 先dp当k=1的情况,然后还要从其l和r之间的间隔先枚举。
#include<bits/stdc++.h>
using namespace std;
int sum[105][105];
int a[105];
const int inf = 0x3f3f3f3f;
int dp[105][105][105];
int main()
{
int n,L,R;
while(scanf("%d%d%d",&n,&L,&R)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(dp,inf,sizeof(dp));
for(int i=1;i<=n;i++)
{
sum[i][i-1]=0;
for(int j=i;j<=n;j++)
{
sum[i][j]=sum[i][j-1]+a[j];
dp[i][j][j-i+1]=0;
}
}
int l,r;
for(int d=0;d<=n;d++)//枚举间距
{
for(l=0;l+d<=n;l++)//枚举l
{
r=l+d;
for(int i=l;i<r;i++)//枚举中间位置
{
for(int x=L;x<=R;x++)//一堆的dp
{
dp[l][r][1]=min(dp[l][r][1],dp[l][i][x-1]+dp[i+1][r][1]+sum[l][r]);
}
for(int k=2;k<=r-l+1;k++)//多堆的dp
dp[l][r][k]=min(dp[l][r][k],dp[l][i][k-1]+dp[i+1][r][1]);
}
}
}
if(dp[1][n][1]==inf) printf("0\n");
else printf("%d\n",dp[1][n][1]);
}
return 0;
}
2017北京赛区J题的更多相关文章
- 2017北京赛区H题
题目链接 题意:在n*m的矩阵中选择变换或者不变换一个数变成p,使得最大子矩阵和最小 1<=n,m<=150, -1000<=p<=1000; 题解: 他人题解链接 涉及到知识 ...
- [hdu5136]Yue Fei's Battle 2014 亚洲区域赛广州赛区J题(dp)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 现场赛的时候由于有个地方有点小问题,没有成功AC,导致与金牌失之交臂. 由于今天下 ...
- 2017北京国庆刷题Day7 morning
期望得分:100+0+100=200 实际得分:100+20+0=120 离散化搞搞 #include<cstdio> #include<iostream> #include& ...
- 2017北京国庆刷题Day5 afternoon
期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...
- 2017北京国庆刷题Day3 morning
期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...
- 2017北京国庆刷题Day2 afternoon
期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一 ...
- 2017北京国庆刷题Day2 morning
期望得分:100+100+40=240 实际得分:100+40+0=140 T1 一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK ...
- HDU-4451-Dressing (2012年金华赛区J题)
Dressing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 2017北京国庆刷题Day4 morning
期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...
随机推荐
- zookeeper 监听事件 NodeCacheListener
zookeeper 监听事件 NodeCacheListener NodeCacheListener一次注册,每次监听,但是监听不到操作类型,不知道是增加?删除?还是修改? 1.测试类: packag ...
- 1 安装企业wiki:confluence
使用wget下载命令下载文件. 下载成功使用dir可以看到文件目录 [root@localhost usr]# diratlassian-confluence-6.3.1-x64.bin bin ...
- path.resolve()和path.join()
resolve 作用:path.resolve() 该方法将一些的 路径/路径段 解析为绝对路径. 语法:path.resolve([...paths]) 说明: ...paths <strin ...
- Android利用方向传感器获得手机的相对角度实例说明
http://www.jb51.net/article/37710.htm 1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较 ...
- Django学习笔记之Web框架由浅入深和第一个Django实例
Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...
- 20145240《网络对抗》逆向及Bof基础实践
逆向及Bof基础实践 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包 ...
- C/C++中RAND_MAX的用法
RAND_MAX是C中stdlib.h中宏定义的一个字符常量: #define RAND_MAX Ox7FFF 其值最小为32767,最大为2147483647 通常在产生随机小数时可以使用RAND_ ...
- Hive中排序和聚集
//五种子句是有严格顺序的: where → group by → having → order by → limit ; //distinct关键字返回唯一不同的值(返回age和id均不相同的记录) ...
- [转载]Javassist 使用指南(二)
======================= 本文转载自简书,感谢原作者!. 原链接如下:https://www.jianshu.com/p/b9b3ff0e1bf8 =============== ...
- win32和x86以及x64的区别
本来是知道x86和x64的区别的. 今天突然在VS2008上看到一个win32的选项,一下子懵了,这是什么玩意. 百度之,发现答案 win32是指windows 32位的操作系统,顾名思义是支持32为 ...