题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4283

自己想了很久还是不会,参考了别人的思路才写的,区间DP还是很弱,继续努力!!

思路:

转载:

题解:想dp[i][j]表示[i ,j]内的unhappiness最小值,枚举k(i<=k<j),有两种情况需要讨论:
          1 如果[i , k]区间内的人全部在[k+1, j]区间内的人之前出列,且已经全部不在栈中,即[i , j]区间可以分为[i , k] , [k+1 ,j]两个完全相同的子问题,
             即dp[i][j] =MIN(dp[i][j] , dp[i][k] + dp[k+1][j] + (sum[j] – sum[i]) * (k – i +1));
          2 如果[i , k]区间内的人全部在[k+1 , j]区间内的人之后出列,即[i , k]区间内的人全部需要进栈,所以出来的顺序是逆序的,需O(n2)预处理出against_order[i][j]
             表示[i , j]区间人逆序出来的unhappiness值,即dp[i][j] = MIN(dp[i][j] , dp[k+1][j] + against_order[i][k] + (sum[k]– sum[i-1]) * (j - k));

我用了记忆化搜索和迭代两种方式实现,主要是为了加深自己的理解和记忆

记忆化搜索代码 :

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 1000010111
int n;
int a[];
int dp[][];
int sum[];
int order[][];
void Make_order()
{
memset(order,,sizeof(order));
for(int j=;j<=n;j++)
for(int i=j-;i>=;i--)
order[i][j]=order[i+][j]+a[i]*(j-i); }
int dfs(int i,int j)
{
if(dp[i][j]<INF) return dp[i][j];
if(i==j) return dp[i][j]=;
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][j],min(dfs(i,k)+dfs(k+,j)+(sum[j]-sum[k])*(k-i+),dp[k+][j]+order[i][k]+(sum[k]-sum[i-])*(j-k)));
return dp[i][j];
}
int main()
{
int t;
scanf("%d",&t);
int tol=;
while(t--)
{
sum[]=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];
}
Make_order();
for(int i=;i<;i++)
for(int j=;j<;j++)
dp[i][j]=INF;
cout<<"Case #"<<tol++<<": "<<dfs(,n)<<endl;
} }

迭代代码:

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 100001000
int dp[][];
int a[];
int sum[];
int order[][];
int n;
void init()
{
scanf("%d",&n);
sum[]=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];
}
for(int i=;i<;i++)
for(int j=i;j<;j++)
if(i==j) dp[i][j]=;
else dp[i][j]=INF;
memset(order,,sizeof(order));
for(int j=;j<=n;j++)
for(int i=j-;i>=;i--)
order[i][j]=order[i+][j]+a[i]*(j-i);
} int main()
{
int t;
int tol=;
scanf("%d",&t);
while(t--)
{
init();
for(int j=;j<=n;j++)
for(int i=j-;i>=;i--)
{
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][j],min(dp[i][k]+dp[k+][j]+(sum[j]-sum[k])*(k-i+),dp[k+][j]+order[i][k]+(sum[k]-sum[i-])*(j-k)));
}
cout<<"Case #"<<tol++<<": "<<dp[][n]<<endl;
}
return ; }

hdu4283 You Are the One 区间DP的更多相关文章

  1. HDU4283 You Are the One —— 区间DP

    题目链接:https://vjudge.net/problem/HDU-4283 You Are the One Time Limit: 2000/1000 MS (Java/Others)    M ...

  2. hdu-4283 You Are the One 区间dp,

    题意:n个人排队上台,每个人有一屌丝值D,他的不满意值=D*(k-1)(k为他前面的总人数). 求整个队列不满意值之和的最小值.你只有一个操作,就是把队首的人塞进小黑屋,也就是压入栈中,后面的人就被提 ...

  3. hdu4283 区间dp

    //Accepted 300 KB 0 ms //区间dp //dp[i][j] 表示i到j第一个出场的最小diaosizhi //对于i到j考虑元素i //(1)i第一个出场,diaosizhi为 ...

  4. HDU4283:You Are the One(区间DP)

    Problem Description The TV shows such as You Are the One has been very popular. In order to meet the ...

  5. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  6. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  7. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  8. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  9. poj2955 Brackets (区间dp)

    题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...

随机推荐

  1. Unity 3D Framework Designing(7)——IoC工厂理念先行

    一谈到 『IoC』,有经验的程序员马上会联想到控制反转,将创建对象的责任反转给工厂.IoC是依赖注入 『DI』 的核心,大名鼎鼎的Spring框架就是一个非常卓越的的控制反转.依赖注入框架.遗憾的是, ...

  2. JS——操作属性

    操作属性: 对象.setAttribute('属性名','值'); - 添加属性对象.getAttribute('属性名'); - 获取属性值,如无此属性,那么返回null <!DOCTYPE ...

  3. PRINCE2考试一共多少道题

    一.Foundation 基础级: 考试时长 1 个小时: 75 道单选题,其中 5 道随机测试题,无论对错都不计入考分:满分 70 分,获得 35 分才能通过考试,正确率 50%: 全程闭卷考试 二 ...

  4. java web中cookies的用法 转

    一.什么是cookies? 大家都知道,浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的 连接.因此当一个请求发送到 ...

  5. sql server 重命名列(字段)

    调用系统存储过程sp_rename,直接看代码: EXEC  sp_rename  'myTable.oldName','newName','COLUMN' 如果重命名表,则: EXEC  sp_re ...

  6. Python之路-基本数据类型

    一.数据类型 1.数字 包含整型和浮点型,还有复数2.字符 长度,索引,切片也适用于列表的操作 移除空白 strip() 默认字符串前后的空格,制表符,换行符 strip(";") ...

  7. [深入学习Redis]RedisAPI的原子性分析

    在学习Redis的常用操作时,经常看到介绍说,Redis的set.get以及hset等等命令的执行都是原子性的,但是令自己百思不得其解的是,为什么这些操作是原子性的? 原子性 原子性是数据库的事务中的 ...

  8. Linux简介与厂商版本上

    Linux简介与厂商版本   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 1. Linux简介 Linux可以有狭义和广义两种 ...

  9. echarts雷达图点击事件

    最近看见别人问的问题,点击雷达图的拐点,获取点击数据的问题,直接上代码. echarts配置问题:https://www.douban.com/note/509404582/ <!doctype ...

  10. 使用SharedPreferences存储用户配置信息

    用SharedPreferences来保存用户的基本配置信息非常的方便,实现起来也很容易:以下是一个简单的例子: 效果截图:    主要代码: public class MainActivity ex ...