标签: 区间dp

hdu4570 http://acm.hdu.edu.cn/showproblem.php?pid=4570

题意:这题题意理解变态的。转自大神博客:

这题题意确实有点难懂,起码对于我这个英语渣渣来说是这样,于是去别人的博客看了下题目意思,归纳起来如下:

给出一个长度为n的数列,将其分成若干段,要求最小,其中ai是每一段数列的第一项,bi是每一段的长度,l为将数列分成l段。

比如样例:n=7,A={1 2 4 4 5 4 3},将其分成1 2 4| 4 5| 4| 3,则其所用空间为1*2^3+4*2^2+4*2^1+3*2^1=38,而如果分成1 2| 4 4 5| 4 3,则其所用空间为1*2^2+4*2^3+4*2^2=52,比38大。

思路:区间DP

用dp[i][j]表示第 i 层到第 j 层用的最少内存

初始化工作是,根据题目, 数据保证答案中的压缩不会超过20层,所以 当 j-i 小于20的时候,dp[i][j]初始化为 a[i]* 2&(j-i+1), 否则初始化为一个INF

方程 dp[i][j]= min(dp[i][j], dp[i][k]+dp[k+1][j] )   i<=k<j

自WA点: 构造解时候,i 和 j都该逆序遍历

 #include <iostream>
#define N 65
using namespace std; const long long INF = 1LL<<;
long long dp[N][N],a[N]; int main()
{
int _;
cin>>_;
while(_--)
{
int n,i,j,k;
cin>>n;
for(i=;i<n;i++) cin>>a[i];
for(i=;i<n;i++)
for(j=i;j<n;j++)
if(j-i<) dp[i][j]=a[i]*(<<(j-i+));
else dp[i][j]=INF;
for(i=n-;i>=;i--)
for(j=n-;j>=i;j--)
for(k=i;k<j;k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+][j]);
cout<<dp[][n-]<<endl;
}
return ;
}

最新文章

  1. html5拖拽事件 xhr2 实现文件上传 含进度条
  2. Oracle OCCI学习之开篇
  3. VC 设置 Stack Overflow
  4. 关系数据库 范式(NF: Normal Form) 说明
  5. javascript学习笔记(1) 简单html语法
  6. HIT 1917 Peaceful Commission
  7. 房上的猫:if选择结构
  8. engine_init_options.go
  9. java 判断null和空
  10. shiro-redis实现session存储到redis
  11. fetch添加超时时间
  12. Python 进程池的同步方法
  13. 选择排序——Selection Sort
  14. Arduino IDE for ESP8266 项目(3)创建AP+STA
  15. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)
  16. 【周年庆】china-pub 14周年庆感恩回馈四波狂热来袭
  17. HttpService与WebService的差异
  18. 免费资源:JellyFish的iOS8应用图标集
  19. golang第三方日志包seelog配置文件详解
  20. leetcode Ch3-DFS &amp; Backtracking II

热门文章

  1. @Bean 和@ Component的区别
  2. git查看某一次commit里面的内容,即本次commit相对于原来的版本进行了哪些修改
  3. python cookbook第三版学习笔记六:迭代器与生成器
  4. [2017-12-20]ElasticSearch 小记
  5. LeetCode:矩形区域【223】
  6. LibreOJ 数列分块入门
  7. zabbix haproxy 监控
  8. Java丨角色权限控制——数据库设计
  9. linux安装与卸载软件
  10. 详解 pthread_detach()函数