hdoj4283 You Are the One
题意:每个人出场时获得等待时间*值的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的更多相关文章
- 专题训练之区间DP
例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http: ...
随机推荐
- C# 将字节流转换为图片的实例方法(转)
代码如下: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem. ...
- Java设计模式应用——策略模式
对于相同类型相同类型的输入输出,在不同场景下需要使用不同的逻辑处理,则可以使用策略模式. 比如排序算法有堆排序,快速排序,冒泡排序,选择排序等.为了保证排序效率,需要在不同场景下选择不同排序算法,这时 ...
- linux centos系统下升级python版本
本文参考资料:https://www.cnblogs.com/leon-zyl/p/8422699.html,https://blog.csdn.net/tpc1990519/article/deta ...
- Java代码质量度量工具大阅兵
FindBugs FindBugs, a program which uses static analysis to look for bugs in Java code. It is free so ...
- php CI 实战教程第一季百度经验杂志
phpCI实战教程第一季_百度经验杂志_百度经验http://jingyan.baidu.com/magazine/16428 杂志为本人php CI实战教程系列经验 从实际项目使用中写系列实战经验, ...
- cisco路由器 三层交换机简单环境配置实例(图)
出处:http://www.jb51.NET/softjc/56600.html cisco路由器&三层交换机简单环境配置实例 一.网络拓扑图: 二.配置命令: 1.路由器的配置: inter ...
- MySQL Crash Course #18# Chapter 26. Managing Transaction Processing
InnoDB 支持 transaction ,MyISAM 不支持. 索引: Changing the Default Commit Behavior SAVEPOINT 与 ROLLBACK TO ...
- Java笔记 #02# 带资源的try语句
索引 普通的 try.java 带资源的 try.java 当资源为 null 的情况 可以参考的文档与资料 / test.txt 待读取的内容 hello. / 普通的 try.java 读取 te ...
- USACO 1.3 Wormholes - 搜索
Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...
- 把一个activity作为弹窗
1.可以在这个activity的xml中设置其高度为某个固定高度 2.在java中:getWindow().setGravity(Gravity.BOTTOM);//设置在底部出现 getWindo ...