You Are the One HDU - 4283 区间DP
https://cn.vjudge.net/problem/HDU-4283
题目大意n个人轮流上台,第i个人有一个屌丝值Di 当他为第k个上台的人时候会获得屌丝值(K-1)*Di,
这些人轮流上台,有个小黑屋可以改变顺序,功能和栈一样后进先出。
然后通过这个小黑屋改变顺序使总屌丝值最小。
对于i-j个人中。第i个人他可以是1 -- j-i+1个人出场,。
即 i...i+1 i+2....j 若想i第k出场则把i-i+k-1塞进小黑屋。所以 i+1 __ i+k-1在i前 i+k __ j 在i后
那么就有转移方程 dp[i][j] = dp[i+1][i+k-1]+dp[i+k][j]+(k-1)*d[i]+k*sum(i+k,j);
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<math.h>
#include<queue>
#define lowbit(x) (x&(-x))
const double eps=1e-8;
const int inf=0x3f3f3f3f;
using namespace std;
const int maxn=1e2+7;
typedef long long ll;
#define ls rt<<1
#define rs rt<<1|1
#define m(i) (node[i].l+node[i].r)>>1
int d[maxn],dp[maxn][maxn],s[maxn];
int sum(int l,int r)
{if(r < l) return 0;return s[r]-s[l-1];
}int main()
{int t,n,cas = 1;scanf("%d",&t);while(t--){scanf("%d",&n);s[0] = 0;for(int i = 1;i <= n;i++){scanf("%d",&d[i]);s[i] = s[i-1]+d[i];}int st = 0;memset(dp,0,sizeof(dp));for(int i = 1;i <= n;i++)for(int j = 1+i; j <= n;j++)dp[i][j] = inf;/*dp[i][j] i-j i第k个上台 i+1 __ i+k-1在他前 i+k __ j 在他后 k可以任意。dp[i][j] i在i-j任意一次完成时的最优解 dp[i][j] = dp[i+1][i+k-1] + dp[i+k][j] + v[i]*(k-1); */for(int l = 1;l <= n;l++){for(int i = 1;i+l-1 <= n;i++){int j = i+l-1;// printf("dp[%d][%d] = %d\n",i,j,dp[i][j]);for(int k = 1;k <= l;k++){dp[i][j] = min(dp[i][j],dp[i+1][i+k-1]+dp[i+k][j]+d[i]*(k-1)+(k)*sum(i+k,j));// i在第k时 i+1 -- i+k-1在i之前 i+k -- j 在i之后// 需要加上i的消耗, i+k--j的消耗 // printf("dp[%d][%d][%d] = %d\n",i,j,k,dp[i+1][i+k-1]+dp[i+k][j]+d[i]*(k-1)+k*sum(i+k,j));}// printf("dp[%d][%d] = %d\n",i,j,dp[i][j]);}}printf("Case #%d: %d\n",cas++,dp[1][n]);}return 0;
}
You Are the One HDU - 4283 区间DP相关推荐
- Palindrome subsequence HDU - 4632 区间dp|记忆化搜索
// 区间dp import java.util.Scanner;/**** @author CN*/ public class main {static int mod = 10007;static ...
- The 2014 ACM-ICPC BeiJing D - Dire Wolf HDU - 5115 区间dp
题意 n个狼 排成一排 我们要把一排狼都删除掉 删除一个狼的花费是这个狼的权值和左右两个狼的附加值 求最小花费 分析 考虑区间dp dp[i][j]表示i到j的最小花费 我们可以枚举其中的k 为序列中 ...
- hdu 2476 区间dp
题意: 给出两个串s1和s2,一次只能将一个区间刷一次,问最少几次能让s1=s2 例如zzzzzfzzzzz,长度为11,我们就将下标看做0~10 先将0~10刷一次,变成aaaaaaaaaaa 1~ ...
- hdu 4745 区间dp
题意:求一个环的最长回文序列,是序列不是串 链接:点我 起点是可以任意的, 所以只要求出每个区间的最长回文序列之后取max(dp[1][i]+dp[i+1][n]),即可得最终答案 本来是想扩展两倍的 ...
- hdu 5115 区间dp 狼BUFF
题目大意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力.你杀死一只狼.你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼 ...
- HDU 5115 Dire Wolf 区间dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...
- HDU 5693 D Game 区间dp
D Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 Description 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它 ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...
最新文章
- [CSAcademy]A-Game
- [云炬python3玩转机器学习] 5-9 scikit-learn中的回归问题
- python区域增长_Python – 有效地为高密度区域创建密度图,稀疏区域的点
- 隐藏了十年的Sudo漏洞爆出:无需密码就能获取root权限
- Android安全机制(2) Android Permission权限控制机制
- java spring 单例模式,spring中的单例模式
- Redis如何实现刷抖音不重复-布隆过滤器(Bloom Filter)
- garageband 淡出_为什么史蒂夫·乔布斯(Steve Jobs)的GarageBand展示了有史以来最好的现场产品演示...
- python文件管不了_Python文件_管道与模块编写
- http://blog.csdn.net/jiazimo/article/details/17265061
- C#:根据特定分隔符分割字符串
- CentOS6.5下lv调整空间大小
- FTP 连接超时解决办法
- 从架构到平台, POWER 9处理器最全解读
- #ardiuno #蓝牙 #if函数判断 #串口中米思齐
- Reflector反编译.NET文件后修复
- MT6737/MT6737T/MT6737M处理器功能介绍,MT6737芯片资料下载
- LED发光二极管限流电阻的计算
- 你不知道的东西----半月痕(中医诊断)
- Face Paper: DSSD论文详解
热门文章
- AtCoder Beginner Contest 242——1111gal password
- 410款INTEL CPU详细技术资料速查表
- python非线性最小二乘拟合_非线性函数的最小二乘拟合——兼论Jupyter notebook中使用公式 [原创]...
- html5编写微信留言,HTML5春节(支持微信和填写姓名)祝福所有程序员幸福快乐...
- 最好玩的steam游戏例举,看看都有那些?
- 积累小结-无法将文件”obj\debug\XXX.dll复制到“bin\Debug\XXX.dll” 拒绝访问
- 中链云&神算云 全球发布暨表彰盛典在深顺利召开
- JetPack Room数据库组件使用方式
- 实现网上购物系统的后台管理(增、删、改、查图书)。
- 大学两年时间的一些感悟