题意:每个人出场时获得等待时间*值的unhappy值。有个栈换出场顺序。问怎样最小?

一开始的时候觉得在中间取断点,dp[i][j]表示区间全出场后的最小值。那么dp[i][j]=dp[i][k]+dp[k+1][j],但这样是不行的。因为有可能最优解是[i][k]只出场部分,剩一些在栈里,然后再出场别的。

注意到栈有一个性质,如果第一个元素是第3个出栈,那么在它出栈前第2,3个元素已经出栈了。如果第一个元素第k出栈,那么[2,k]必在前k-1个出栈。那么状态转移时就列出所有可能的k。

正:

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
using namespace std;
const int SZ=1e2+,INF=0x7FFFFFFF;
typedef long long lon;
int n,arr[SZ],sum[SZ],dp[SZ][SZ]; void init()
{
cin>>n;
for(int i=;i<=n;++i)cin>>arr[i],sum[i]=sum[i-]+arr[i];
for(int len=;len<=n;++len)
{
for(int i=;i<=n;++i)
{
int r=i+len-;
if(r>n)break;
dp[i][r]=INF;
for(int k=;k<=len;++k)
{
dp[i][r]=min(dp[i][r],dp[i+][i+k-]+dp[i+k][r]+(k-)*arr[i]+(k)*(sum[r]-sum[i+k-]));
//if(i==1&&r==3)cout<<"dp[i][r]: "<<dp[i][r]<<" "<<dp[i+k][r]<<endl;
}
}
}
// for(int i=1;i<=n;++i)
// {
// for(int j=i;j<=n;++j)
// {
// cout<<"i: "<<i<<"j: "<<j<<" "<<dp[i][j]<<" ";
// }cout<<endl;
// }
cout<<dp[][n]<<endl;
} int main()
{
std::ios::sync_with_stdio();
int casenum;
cin>>casenum;
for(int time=;time<=casenum;++time)
{
cout<<"Case #"<<time<<": ";
init();
}
return ;
}

误:

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
using namespace std;
const int SZ=1e2+,INF=0x7FFFFFFF;
typedef long long lon;
int n,arr[SZ],sum[SZ],dp[SZ][SZ],st[SZ][SZ]; void init()
{
cin>>n;
for(int i=;i<=n;++i)cin>>arr[i],sum[i]=sum[i-]+arr[i];
for(int len=;len<=n;++len)
{
for(int i=;i<=n;++i)
{
int r=i+len-;
if(r>n)break;
st[i][r]=st[i+][r]+(len-)*arr[i];
}
}
for(int len=;len<=n;++len)
{
for(int i=;i<=n;++i)
{
int r=i+len-;
if(r>n)break;
dp[i][r]=st[i][r-]+(sum[r-]-sum[i-]);
if(i==&&r==)cout<<"h: "<<dp[i][r]<<endl;
for(int k=i;k<r;++k)
{
dp[i][r]=min(dp[i][r],dp[i][k]+st[k+][r-]+max(,(k-i+))*(sum[r-]-sum[k])+(k-i+)*arr[r]);
if(i==&&r==)cout<<"h: "<<dp[i][r]<<endl;
}
}
}
// for(int i=1;i<=n;++i)
// {
// for(int j=i;j<=n;++j)
// {
// cout<<"i: "<<i<<"j: "<<j<<" "<<dp[i][j]<<" ";
// }cout<<endl;
// }
cout<<dp[][n]<<endl;
} int main()
{
std::ios::sync_with_stdio();
int casenum;
cin>>casenum;
for(int time=;time<=casenum;++time)
{
cout<<"Case #"<<time<<": ";
init();
}
return ;
}

hdoj4283 You Are the One的更多相关文章

  1. 专题训练之区间DP

    例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http: ...

随机推荐

  1. 持续集成之三:Maven私服Nexus使用

    环境 Red Hat Enterprise Linux Server release 7.3 (Maipo) jdk1.7.0_80 apache-tomcat-7.0.90 mysql-5.7.23 ...

  2. Python: 序列list:保持元素顺序同时消除重复值

    问题:怎样在Python的一个序列上面保持元素顺序的同时消除重复的值?answer:如果序列上的值都是hashable 类型,那么可以很简单的利用集合或者生成器来解决这个问题. eg1: def de ...

  3. Hive 常用优化参数

    常用调优测试语句 :    ①显示当前hive环境的参数值: set 参数名; 如:   hive> set mapred.map.tasks;mapred.map.tasks;   ②设置hi ...

  4. Linux基础命令---chmod

    chmod 改变文件或者目录的权限,可以用数字或者字母来标识权限.在数字模式下:0,代表没有权限:1,代表可执行:2,代表可读:4,代表可写:多个权限可以相加.在字符模式下:x,代表执行:r,代表读: ...

  5. Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建

    Zookeeper是一种在分布式系统中被广泛用来作为:分布式状态管理.分布式协调管理.分布式配置管理.和分布式锁服务的集群.kafka增加和减少服务器都会在Zookeeper节点上触发相应的事件kaf ...

  6. 20145330 《网络攻防》 MSF基础应用

    20145330 <网络攻防> MSF基础应用 1.实验后回答问题 (1)用自己的话解释什么是exploit,payload,encode. exploit:进行渗透攻击的模块合集 pay ...

  7. 20145221《网络对抗》PC平台逆向破解

    20145221<网络对抗>PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户 ...

  8. noip2007部分题

    1.统计数字 题目描述 Description 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000 个,现在需要统计这些自然数各自出现 ...

  9. Asterisk1.8 转码策略分析

    最近在修改asterisk转码和编码协商的问题,发现asterisk的转码策略的选择还是有些问题的(基于1.8.9.3版本).——————————————相关的CLI命令转码路径的调试命令:core ...

  10. Codeforces Round #426 (Div. 2) C. The Meaningless Game

    C. The Meaningless Game 题意: 两个人刚刚开始游戏的时候的分数, 都是一分, 然后随机一个人的分数扩大k倍,另一个扩大k的平方倍, 问给你一组最后得分,问能不能通过游戏得到这样 ...