博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4283 You Are the One [区间DP]
阅读量:7282 次
发布时间:2019-06-30

本文共 1079 字,大约阅读时间需要 3 分钟。

  有一个栈,你可以把这个栈中的数吐到另一个栈中去,然后每次可以从两个栈中选择一个数出栈,使∑num[i]*(i-1)最小,num[i]代表第i个出栈的数。

  比赛的时候一直没想法,看了解题报告才恍然大悟。。对于每个区间,枚举第一个人是第几个出栈的,假设区间是[L,R],第一个人是i个出栈的,那么这个栈就被分成了三部分,[L,L],[L+1,L+i],[L+i+1,R],对后面两个区间看作子问题继续DP,注意对后面一个区间要加上(sum[R]-sum[L+i-1])*i,sum[i]表示前缀和。

  

1 #include 
2 #include
3 #include
4 #define INF 0x3f3f3f3f 5 int cas,n,xx[105],sum[105],d[105][105]; 6 int dp(int l,int r){ 7 if(d[l][r]!=INF)return d[l][r]; 8 if(l>=r)return 0; 9 for(int i=1;i<=r-l+1;i++){10 int tmp=dp(l+1,l+i-1)+dp(l+i,r)+xx[l]*(i-1)+(sum[r]-sum[l+i-1])*i;11 d[l][r]=std::min(d[l][r],tmp);12 }13 return d[l][r];14 }15 int main(){16 scanf("%d",&cas);17 for(int ca=1;ca<=cas;ca++){18 scanf("%d",&n);19 for(int i=1;i<=n;i++){20 scanf("%d",&xx[i]);21 sum[i]=sum[i-1]+xx[i];22 }23 memset(d,0x3f,sizeof d);24 printf("Case #%d: %d\n",ca,dp(1,n));25 }26 return 0;27 }

 

  

转载于:https://www.cnblogs.com/swm8023/archive/2012/09/14/2684595.html

你可能感兴趣的文章
android 隐藏输入法键盘
查看>>
Android jni 中打印logcat日志
查看>>
SSL和keystore生成、导入等配置
查看>>
The Eagles Hotel California Lyrics
查看>>
软件工程——课程评价
查看>>
OpenStack Placement Project
查看>>
微信支付问题
查看>>
购买类目的概率预测
查看>>
Ajax Step By Step2
查看>>
codeforces 701 B. Cells Not Under Attack
查看>>
当同时安装Python2和Python3后,如何兼容并切换使用详解(比如pip使用)
查看>>
Creating a Custom Page Layout in SharePoint 2013
查看>>
mysql foreignkey
查看>>
Django 中的自定义分页标签
查看>>
[转]ASP.NET自定义控件复杂属性声明持久性浅析
查看>>
PAT (Basic Level) Practise (中文)-卡拉兹(Callatz)猜想
查看>>
第八周进度总结
查看>>
axios 注意点
查看>>
刷新ListView刷新时的闪烁问题
查看>>
cuda c例程学习——eigenvalues(1)
查看>>