String painter

题目链接:

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

题意:

有n个人参加选秀,每个人有一个Di值,Di值*(出场时间-1)决定他们的悲惨度,这i个人按顺序出场,但是在出场前可以通过一个栈略微调整出场顺序,输出调整后的总悲惨度最小值。

题解:

设dp[i][j]是区间[i,j]部分的最小悲惨值和,终点状态为dp[1][n]。可以发现,对于每个[i,j]区间不需要考虑 i 以前和 j 以后的部分,那么 i 就是第一个参赛选手,不妨在[i,j]内找到一个点 k 使得 i 进栈且在 k 点之后出栈,由于每个区间[i+1,k]内的值进栈后都需要出栈(废话= =),因此 i 点即是栈里的唯一一个元素 ,i 入栈对区间[i+1,k]的影响仅为sum[k]-sum[i](区间[i+1,k]整体左移了一次),而区间[k+1,j]则不受影响,所以状态转移方程dp[i][j]=min(dp[i][j],dp[i+1][k]-(sum[k]-sum[i])+a[i]*(k-1)+dp[k+1][j])

代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=102;
int a[N],sum[N],dp[N][N];
int mmin(int x,int y)
{
  return x<y?x:y;
}
void solve()
{
  int T,n,Case=0;
  scanf("%d",&T);
  memset(dp,0,sizeof(dp));
  while(T--)
  {
    scanf("%d",&n);
    sum[0]=sum[n+1]=0;
    for(int i=1;i<=n;++i)
    {
      scanf("%d",&a[i]);
      sum[i]=sum[i-1]+a[i];
    }
    for(int len=0;len<n;++len)
    {
      for(int i=1;i+len<=n;++i)
      {
        int j=i+len;
        dp[i][j]=dp[i][j-1]+a[j]*(j-1);
        for(int k=i;k<=j;++k)//区间左端点i在第k点出栈
        dp[i][j]=mmin(dp[i][j],dp[i+1][k]-(sum[k]-sum[i])+a[i]*(k-1)+dp[k+1][j]);
      }
    }
    printf("Case #%d: %d\n",++Case,dp[1][n]);
  }
}
int main()
{
  solve();
  return 0;
}

 

转载于:https://www.cnblogs.com/kiuhghcsc/p/5759727.html

HDU 4283:You Are the One 区间DP好题相关推荐

  1. 洛谷P3146 区间dp做题笔记

    不是题解,不是题解,不是题解,纯属个人笔记,不知所言. 传送门:P3146 问:什么时候才能写的一手漂亮的dp? 答:夜深人静之时,魂归故里之日. 此题是一道基础的区间dp的题,看完题解犹豫片刻,之后 ...

  2. HDU 5693:D Game(区间DP)

    D Game Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  3. hdu 4632 子字符串统计的区间dp

    题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[ ...

  4. HDU 5115 (杀狼,区间DP)

    题意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力.你杀死一只狼.你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼时, ...

  5. 合并石子 区间dp水题

    合并石子 链接: nyoj 737 描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N- ...

  6. HDU 5115 M - Dire Wolf 【区间dp】

    传送门 Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if ...

  7. HDU 5968 异或密码(区间dp)

    Problem Description 晨晨在纸上写了一个长度为N的非负整数序列{ai}.对于这个序列的一个连续子序列{al,al+1,-,ar}晨晨可以求出其中所有数异或的结果 alxoral+1x ...

  8. HDU - 2871 Memory Control(线段树+区间合并)好题!

    题目链接:点击查看 题目大意:给定n个内存和m个操作,分别是: New x:从内存编号1开始向右查找,分配一个长度为x的空间,若找到输出区间的首地址,否则输出Reject New: Free x:释放 ...

  9. 石子归并 51Nod - 1021(区间DP入门题)

    N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. 例如: 1 2 3 4,有不少 ...

最新文章

  1. 《zabbix用户权限分配管理》-8
  2. 「查缺补漏」巩固你的 RocketMQ 知识体系
  3. 迁移物理solaris系统至一个区域
  4. 【整理】SAP货币汇率转换
  5. 用JS实现根据当前时间随机生成流水号或者订单号
  6. Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
  7. Oracle EBS 入门
  8. 数据挖掘:模型选择——集成算法与树模型
  9. [MySQL]触发器
  10. 如何在MacOS中进行声音内录
  11. excel2010服务器打开闪退
  12. 苹果计算机显示错误怎么按,教你解决苹果电脑装windows7提示磁盘分区错误的方法...
  13. 推荐一本老外给初学者学习ABAP的书籍,2012年12月上市。
  14. 为什么有人愿意将软件开源和共享?
  15. JPA中could not insert: 的解决办法
  16. 文件服务器禁用u盘复制数据,如何禁止U盘拷贝
  17. 当我精通vue2的源码dep和watcher的关系时
  18. 使用Python和Numpy构建神经网络模型
  19. CTFHub——Web技能树
  20. Kafka——Sender 线程分析

热门文章

  1. springboot旅游系统设计技术描述_5A旅游景区标识标牌系统业材料的工艺技术
  2. java 类加载器卸载,【深入明白Java虚拟机 】类加载器的命名空间以及类的卸载...
  3. python代码编写_高质量Python代码编写的5个优化技巧
  4. java io教程_Java IO教程
  5. jqueryui时间插件_jQueryUI工具提示插件
  6. jquery 查找祖先元素_如何获得jQuery中元素的第一个祖先
  7. 开课吧:浅析语音识别算法工程师能力要求
  8. 2021最新Java高频面试题,很适合大厂面试
  9. common-jdbc:一个基于SpringJdbcTemplate的高性能数据库操作工具类库
  10. nodejs基础整理