题意:给定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. 本地代码git到github上

    本地代码git到github上 对于个程序员来说,不写自己的博客,没有自己的作品集没有Github就不算好的程序员!咳咳~ 开个玩笑.对于我个人来说,要做个程序员,就要有自己的作品集和技术博客(我说是 ...

  2. SQL查询显示行号、随机查询、取指定行数据

    转自:walkingp 1.显示行号 如果数据没有删除的情况下主键与行号是一致的,但在删除某些数据,行号就与主键不一致了,这时需要查询行号就需要用新的方法,在SQL Server2005之前,需要使用 ...

  3. SQL Server2005 表分区三步曲(zz)

    前言 SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上.每一个表分区都和在某个文件 组(filegroup)中的单个文件关联.同样的一个文件/文件组可以容纳 ...

  4. hdu 5073 Galaxy

    题意是给定n个点,让求找到一个点p使得sigma( (a[i] - p) ^ 2 ) 最小,其中a[i]表示第i个点的位置.其中有k个点不用算. 思路:发现这道题其实就是求n-k个点方差. 那么推一下 ...

  5. <input value="hidden">的作用

    这样子上个页面的参数可以保存在这个页面,为下个页面获取参数做准备,在这个页面表单提交的时候下个页面可以获取参数

  6. cmd运行java程序,无黑框闪烁

    程序目录中创建 “启动.bat” @echo off set mypath="%~dp0myjar.jar" echo %mypath% start javaw -jar %myp ...

  7. Orace数据库锁表的处理与总结<摘抄与总结三>

    当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误. TX锁等待的分析 Oracle数据库中一般使用行级锁. 当Oracle ...

  8. PS2251-07 海力士(金士顿U盘量产,成功!)

    U盘挂掉了,用芯片无忧测到是这个样子的,看到是PS2251-07 海力士的 网上找了很多方法都不成功,最后找到了两个可以量产成功的方法,建议使用第一种. 首先,附上三个检测工具 芯片无忧.GetInf ...

  9. VS 编程常见错误及解决方法

    1. VS2013 无法打开包括文件:“cv.h"等一些头文件 解决方法: cv.h是build\include文件夹下的头文件,所在文件夹位置是D:\Program Files (x86) ...

  10. C++ cout cerr 和 clog 的区别

    我们都知道C++预定义了cin(标准输入流)和cout(标准输出流).但今天突然又蹦出来两个cerr(标准错误流(非缓冲))和clog(标准错误流(缓冲)),本着学习提高的态度在网上搜索了相关内容,下 ...