题意:每个人出场时获得等待时间*值的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. Hive 常用优化参数

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

  2. 比特币、莱特币钱包下载和把数据迁移到C盘以外其他盘

    比特币是目前最热门和价格最高的虚拟币,国内外多个平台可以进行交易,有些商家可以用比特币进行支付有些国家可以在ATM取款. Bitcoin-Qt就是最早的比特币客户端,构建了比特币的骨干网络,具有高度的 ...

  3. [目前最火的前端开发框架]React组件的应用分析

    React组件 一.如何创建React组件 方式一:React.createClass 用 React.createClass 构建组件是 React 最传统.也是兼容最好的方法. const But ...

  4. 20145104张家明 《Java程序设计》第7周学习总结

    20145104张家明 <Java程序设计>第7周学习总结 教材学习内容总结 第13章 简单认识时间和日期 -时间的度量:GMT.UT.TAI.UTC.Unix.epoch. -UTC:保 ...

  5. Vue 父组件循环使用refs调用子组件方法出现undefined的问题

    Vue 父组件循环使用refs调用子组件方法出现undefined的问题 1. 背景 最近前端项目遇到一个问题,我在父组件中使用了两个相同的子组件child,分别设置ref为add和update.其中 ...

  6. 一款简单实用的jQuery图片画廊插件

    图片画廊 今天分享一个自己实现的jQuery 图片画廊插件. 看一下效果图: 点击图片时: 在线演示地址:http://www.jr93.top/photoGallery/photoGallery.h ...

  7. Python3基础 if else 格式 输入一个整数并判断是8吗

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. Ansible 入门指南 - 学习总结

    概述 这周在工作中需要去修改 nginx 的配置,发现了同事在使用 ansible 管理者系统几乎所有的配置,从数据库的安装.nginx 的安装及配置.于是这周研究起了 ansible 的基础用法.回 ...

  9. hdu4719 Oh My Holy FFF 线段树优化dp

    思路 好久之前的了,忘记什么题目了 可以到我这里做luogu 反正就是hdu数据太水,导致自己造的数据都过不去,而hdu却A了 好像是维护了最大值和次大值,然后出错的几率就小了很多也许是自己写错了,忘 ...

  10. JavaScript:Object属性方法

    Object的属性(firebug中没有找到) var pro={ city:"shanghai", list:[,,,,] } var Person=function(name, ...