Learning Vector - UVa 12589 dp
来源:互联网 发布:史上最奇葩的淘宝差评 编辑:程序博客网 时间:2024/05/16 19:45
题意:从n对坐标中选择k对,然后连接成线,问这条线与x轴所围面积的最大值是多少。
思路:dp[i][j]表示用i个组成高度为j的情况下的面积最大值,然后就是利用背包的思想,每次i从大到小转移。
AC代码如下:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{ int x,y;}vc[60];bool cmp(node a,node b){ return a.y*b.x>b.y*a.x;}int dp[60][2510],vis[60][2510],rem[60][2510];int main(){ int T,t,n,i,j,k,p,h,x,y,ans,len1,len2; scanf("%d",&T); for(t=1;t<=T;t++) { scanf("%d%d",&n,&k); memset(dp,-1,sizeof(dp)); for(i=0;i<=n;i++) { dp[0][0]=0; rem[i][0]=0; } rem[0][0]=1; rem[0][1]=0; for(i=1;i<=n;i++) scanf("%d%d",&vc[i].x,&vc[i].y); sort(vc+1,vc+1+n,cmp); for(i=1;i<=n;i++) { x=vc[i].x; y=vc[i].y; len1=min(k,i); for(j=len1;j>=1;j--) { len2=rem[j-1][0]; for(p=1;p<=len2;p++) { h=rem[j-1][p]; dp[j][h+y]=max(dp[j][h+y],dp[j-1][h]+x*y+2*x*h); if(dp[j][h+y]>=0 && vis[j][h+y]!=t) { vis[j][h+y]=t; rem[j][0]++; rem[j][rem[j][0]]=h+y; } } } } ans=0; for(i=0;i<=2500;i++) ans=max(ans,dp[k][i]); printf("Case %d: %d\n",t,ans); }}
0 0
- Learning Vector - UVa 12589 dp
- UVA - 12589(learning vector dp)
- [UVA 12589]Learning Vector[DP]
- UVA 12589 Learning Vector(DP)
- UVa 12589 Learning Vector
- uva 12589 Learning Vector
- UVa 12589 Learning Vector
- Uva-12589 Learning Vector
- uva 12589 learning vector
- UVA 12589 Learning Vector
- UVA 12589 Learning Vector 解题报告
- uva 12589——Learning Vector
- Learning Vector UVA
- Learning Vector
- uva 12589 dp
- UVA 1412 - Fund Management(用vector容器模拟状态的状压dp)
- uva 10797 learning portugues
- [Machine Learning]--Support Vector Machine
- Android利用reative_layout生成梅花界面
- Unity3D_NGUI 灰度shader
- SQL Server 中关于EXCEPT和INTERSECT的用法
- PSI信息解析
- osgEarth支持中文过程详解
- Learning Vector - UVa 12589 dp
- XMPPFramework
- mac erlang hello world
- EHCache工具类
- HDU 1195
- Linux下passwd和shadow文件内容详解
- 框架学习七-2:ViewPager+Fragment之Fragment深入介绍
- Html常用符号
- UVa 10465 - Homer Simpson