题意:有n堆石头,盘古每次可以选择连续的x堆合并,所需时间为x堆石头的数量之和,x∈[l,r],现在要求,能否将石头合并成一堆,如果能,最短时间是多少。

思路:(参考了ACM算法日常)DP[i][j][k],表示当前状态下[i,j]这个区间分成了k堆。

   状态转移:1.k=1时,dp[i][j][k]=min(dp[i][j][D]+num[j]-num[i-1]),其中D∈[l,r],

        2.k!=1时,dp[i][j][k]=min(dp[i][z][1]+dp[z+1][j][k-1]),(合并成k堆时,可以转化为k-1堆与1堆合并,此时就是区间DP的思路了)

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,l,r,a[];
int dp[][][],num[];
int main(){
while(~scanf("%d%d%d",&n,&l,&r)){
num[]=;
memset(dp,0x3f,sizeof(dp));
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
num[i]=num[i-]+a[i];
}
for(int i=;i<=n;i++)
dp[i][i][]=;
for(int i=;i<=n;i++){
for(int j=;j+i-<=n;j++){
for(int k=i;k>=;k--){
if(k==){
for(int z=l;z<=r;z++)
dp[j][j+i-][k]=min(dp[j][j+i-][k],dp[j][j+i-][z]+num[j+i-]-num[j-]);
}
else {
for(int z=j;z<j+i-;z++)
dp[j][j+i-][k]=min(dp[j][j+i-][k],dp[j][z][]+dp[z+][j+i-][k-]);
}
}
}
}
if(dp[][n][]==0x3f3f3f3f)
printf("0\n");
else printf("%d\n",dp[][n][]);
}
return ;
}

By xxmlala

最新文章

  1. linux下tar命令详解
  2. 转摘http://blog.csdn.net/hulihui/article/details/3351922#s6
  3. SQL— CONCAT(字符串连接函数)
  4. Unsupported major.minor version 51.0 在配置/运行Maven工程时,JDK与Maven所引用的jdk版本不一致
  5. Spring整合activiti-modeler5.16遇到的小问题
  6. 编译安装-Nginx
  7. TCP/IP详解学习笔记(14)-TCP连接的未来和性能(未写完)
  8. ORACLE STUDY NOTES 02
  9. Java简单记录
  10. SVG视野
  11. nginx常用配置系列-静态资源处理
  12. 多选穿梭框总结 (vue + element)
  13. Django 生成验证码或二维码 pillow模块
  14. pip 解决下载包速度慢的问题
  15. Luogu P3455 [POI2007]ZAP-Queries
  16. Rpgmakermv(16) YEP MainmenuManager
  17. LINUX下PHP网页生成快照(截屏)(xvfb and wkhtmltoimage)
  18. mac 无法打开xx ,因为无法确认开发者身份
  19. FreeRTOS 计数信号量
  20. React--- react 初见React 总结

热门文章

  1. Linux之文件通信
  2. setjmp
  3. 第一次Java测试及感触(2018.9.20)
  4. Git生成本机SSH Key并添加到GitHub中
  5. JavaEE三大框架的整合
  6. aop 通知的执行顺序
  7. arcgis python 获得表字段的唯一值
  8. HearthBuddy炉石兄弟 Method &#39;Entity.GetRace&#39; not found.
  9. Mysql表的横向拆分与纵向拆分
  10. 针对thinkphp 5框架存储过程bug而重写的存储过程的扩展类