题意:给定n(n<=100)个人,每个人有个固定的屌丝值D。 起初这些人是站成一行,当第i个人第j个去面试的时候他的值是 Di*j。
要求所有人面试之后 这些值加起来是最小的。
队伍站成一行(其实就是个队列), 队列头部里的人可以到一个小黑屋子里,先进黑屋子的必须后出来(相当于一个栈)。
然后队首的人可以选择进黑屋或者去面试,黑屋里的也可以选择去面试。 要求最少的Di*j 值之和。
===============================================================================
题目分析:
这个题目也是想了好久, 最初看的时候一直认为DP式子是:
 dp[L][R] = min( dp[L][R], dp[L+1][k] + a[L]*k + dp[k+1][R] )   (L<= k <= R)
起初是这样认为的。但是后来发现这样的子结构其实是不对的, 我们对其位置交换的时候会出现一些问题。
后来看看题解发现问题所在:
子结构其实应该是 DP[L][R] 代表区间L,R之间 (0,R-L)次选择的方式。并不应该是(L,R)的选择方式。
(sum[i] 代表从a[0]加到a[i])
故得到一个递推式: dp[L][R] = min(dp[L][R], dp[L+1][L+k] + a[L]*k + dp[L+k+1][R] + (sum[R]-sum[L+k])*(k+1) );
关键是:为什么要加上他 (sum[R]-sum[L+k])*(k+1) 。 前面我们  dp[L+1][L+k] 这个区间不用加是因为我们最先选的就是这个区间,所以不加。
至于区间dp[L+k+1][R],  因为我们的算的是区间(L+k+1,R)的第k次选择的结果,而k是(0,R-L-k-1)的。因此我们少加上了 (sum[R]-sum[L+k])*(k+1) 。
=========================================================================================
 
 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL INF = 0xfffffff;
const LL maxn = ;
int dp[maxn][maxn], a[maxn], sum[maxn]; int DFS(int L,int R)
{
if(dp[L][R])
return dp[L][R];
if(L > R)
return ; dp[L][R] = INF;
for(int k=; k<=R-L; k++)///在区间【L,R】内,这个数该如何去选择
{///假设第L个数字,要在第K次选择
dp[L][R] = min(dp[L][R], DFS(L+, L+k) + a[L]*k + DFS(L+k+,R) + (sum[R]-sum[L+k])*(k+) );
}
// printf("dp[%d][%d]:%d\n",L, R, dp[L][R]);
return dp[L][R];
}
/*
第L个元素第k个出场拍,
*/
int main()
{
int T, n, cas = ;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(dp, , sizeof(dp));
for(int i=; i<n; i++)
scanf("%d", &a[i]);
sum[] = a[]; for(int i=; i<n; i++)
sum[i] = sum[i-] + a[i]; printf("Case #%d: %d\n",cas ++, DFS(, n-));
}
return ;
} /*
2
2
4 5 2
5
1 2 3 4 5 5
5 4 3 2 2
*/

HDU 4283 You Are the One的更多相关文章

  1. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. HDU 4283 You Are the One(区间DP(最优出栈顺序))

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4283 题目大意:有一群屌丝,每个屌丝有个屌丝值,如果他第K个上场,屌丝值就为a[i]*(k-1),通过 ...

  3. HDU 4283:You Are the One(区间DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:有n个数字,不操作的情况下从左到右按顺序输出,但是可以先让前面的数字进栈,让后面的数字输出,然后栈里 ...

  4. HDU 4283 You Are the One (12年天津 区间DP)

    题意:有一个队列,每个人有一个愤怒值a[i],如果他是第k个上场,不开心指数就为(k-1)*a[i].但是边上有一个小黑屋(其实就是个堆栈),可以一定程度上调整上场程序 思路:枚举区间和每个人第几个上 ...

  5. 区间DP HDU 4283

    t个数据 n个权值 1->n 可以入栈调整顺序 花费 第k个出来 w[i]*(k-1); 求花费最少 #include<stdio.h> #include<string.h&g ...

  6. hdu 4283 You Are the One 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. HDU 4283 You are the one(间隔DP)

    标题效果: The TV shows such as You Are the One has been very popular. In order to meet the need of boys ...

  8. You Are the One HDU - 4283 (区间DP)

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

  9. HDU 4283 You Are the One 【区间DP】

    <题目链接> 题目大意: 有$n$个人排成一排要上台表演,每个人有一个屌丝值$pi$.第i个上台表演的人,他的不满意度为$(i-1)*p_i$.现在有一个类似于栈的黑屋子,你可以让某些人进 ...

随机推荐

  1. urlconnection用法(转)

    1.获取ip地址 package demo.net; import java.net.InetAddress; import java.net.UnknownHostException; /* * 获 ...

  2. WKWebView使用过程中的那些坑

    问题产生背景: 新开发的页面中有一部分的界面是需要展示后端接口返回的HTML代码,包括文字和图片.所以就自然而然的要使用iOS原生的WebKit. 鉴于Xcode 8发布以后,编译器支持的最低版本(D ...

  3. jquery ajax异步调用

    写程序的第一步都要知其然,至于知其所以然就要看个人的爱好了.下面说一下web开发中经常用的ajax. 这里是用的jquery框架实现的ajax异步调用.废话少说先上代码.(asp.net开发) var ...

  4. JAVA导出Excel封装

    1.数据bean public class ExcelBean { private String name; private String sheetName; private ExcelTitle[ ...

  5. 前端自动化构建工具 Gulp 使用

    一个月没写博客了,今天有时间,就写个gulp的入门使用吧.. 简介:gulp是一个前端自动化构建工具,可以实现代码的检查.压缩.合并……等等,gulp是基于Node.js的自动任务运行器 一.安装No ...

  6. C# 面向对象编程的继承性-多继承

    多继承 如果要使用多继承,需要使用接口,因为C#中的类只支持单继承,而接口支持多继承,实现多继承时,继承的多个接口中间用逗号(,)隔开. 说明: 实现多继承时,继承的可以是多个接口,也可以是一个类及多 ...

  7. vim备注

    ① 用户path生效 在~/.bashrc中修改path,在~/.profile中source bashrc ② secureCRT着色方案 底色RGB:43 43 43 前景色RGB:221 221 ...

  8. BeanUtils的日期问题

    //注册日期类型转换器 //第一种  自定义方法            ConvertUtils.register(new Converter(){                //第一个参数是目标 ...

  9. Linux ./configure && make && make install 编译安装和卸载

    正常的编译安装/卸载: 源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install).   configure文件是一个可执行的脚本文件,它有很多选项, ...

  10. Bootstrap_表单_表单控件

    一.输入框input 单行输入框,常见的文本输入框,也就是input的type属性值为text. 在Bootstrap中使用input时也必须添加type类型,如果没有指定type类型,将无法得到正确 ...