题意:

有n个人排队,第i个入场的人x的不愉快度是$D_x*(i-1)$,现在给你n个人在队伍中的位置,

你可以用一个栈让一个人后面的人先进入,问最小的不愉快度是多少。

解法:

考虑注意到用栈调整次序时,如果$x_1$从$l$调整到了$r$的位置,那么如果有$x_2$的位置在$l$,

$r$之间那么一定要满足$l<l_2<=r_2<r$。

这样考虑dp:

$f(i,j)$表示i到j最大可以通过调整减小多少的不愉快度,这样就可以dp了。

(注意在转移不交换的情况下$f(i,j) = max \{ f(i+1,j), f(i,j-1) \}$ 不正确,

因为这样求出来的是一个一个大区间套着小区间的答案,不能表示两个区间相互独立的情况,

应该是$f(i,j) = max \{ f(i,k)+f(k+1,j) \}$)

时间复杂度$O(n^3)$。

 #include <iostream>
#include <cstdio>
#include <cstring> #define N 110 using namespace std; int n,ans;
int D[N],f[N][N],S[N]; int main()
{
int T,Te=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
S[]=;
ans=;
for(int i=;i<=n;i++)
{
scanf("%d",&D[i]);
S[i]=S[i-]+D[i];
ans+=(i-)*D[i];
}
for(int i=;i<=n;i++) f[i][i]=;
for(int d=;d<=n;d++)
{
for(int i=;i<=n-d+;i++)
{
int j=i+d-;
f[i][j]=;
for(int k=i;k<j;k++)
f[i][j] = max(f[i][j], f[i][k]+f[k+][j]);
f[i][j] = max(f[i][j], f[i+][j]+S[j]-S[i]-D[i]*(j-i));
}
}
printf("Case #%d: %d\n",++Te,ans-f[][n]);
}
return ;
}

最新文章

  1. 使用IntelliJ IDEA 配置Maven(入门)【转】
  2. cocos2dx的android版FileUtils的坑
  3. 粗略了解struts2
  4. \(\S1 \) Gaussian Measure and Hermite Polynomials
  5. 升级到EntityFramework 6的注意事项
  6. 5分钟让你学会用最高效的工具解析所有Json
  7. django+celery+redis环境搭建
  8. 为什么使用Redis
  9. 【python】字符串、列表、元组间相互转化及函数len、max、min、sum、sorted、reversed、enumerate、zip用法示例
  10. 安卓笔记-可以滚动的TextView
  11. CDN边缘节点容器调度实践(上)
  12. [物理学与PDEs]第1章习题6 无限长载流直线的磁场
  13. ThreadLocal总结
  14. Glide和Govendor安装和使用
  15. kendo treeview checkbox初始化选中问题,没解决,暂时记录下
  16. 惊闻企业Web应用生成平台 活字格 V4.0 免费了,不单可视化设计器免费,服务器也免费!
  17. JavaScript基础(2)-DOM
  18. EF Code First学习笔记 初识Code First(转)
  19. Django框架----models.py(数据库操作文件)
  20. VisualVM使用Jstatd和JMX远程监控配置(转载)

热门文章

  1. HAProxy简单使用
  2. ElasticSearchserver操作命令
  3. div和img之间的缝隙问题
  4. OpenCV4Android编译
  5. IntelliJ IDEA配置Tomcat及部署项目
  6. VB.NET版机房收费系统—数据库设计
  7. HBase GC日志
  8. Open Source Streaming Server--EasyDarwin
  9. spring+mybatis多数据源,动态切换
  10. Java类加载器(死磕 1-2)