题目大意:给n(n<=50)个向量(xi,yi) (0<=xi<=yi<=50),选出其中k(1<=k<=n)个,从(0,0)点开始,依次首尾相连,求此k个向量与x正半轴围成的最大面积的两倍并输出。

初步想法,向量都在第一象限,所以最优解一定是选中k个排成上凸曲线。故第一步是按照向量斜率排序!

然后就是迭代dp了。

先看看暴力方程dp[i][j][y]=max(dp[i][j][y],dp[o][j-1][y-li[i].y]+f(li[i].x,li[i].y,y)) (对于任意的i>o>=j)这个时候需要枚举o,效率是很不乐观的。

优化:假设dp[i][*][*]都已经求出来了。

那么dp[i+1][j][y]=max(dp[i][j][y],dp[i][j-1][y-li[i+1].y]+f(li[i+1].x,li[i+1].y,y)),这样i推出i+1就是O(1)的效率了,初始状态就是dp[x][0][0]=0。

再加上一点剪枝,这样就是很好的solution了。

再看看样例,有T<=110个case,所以不能每次循环都memset(dp,0,sizeof(dp))一遍,加访问标记。(建议ACMer新手每次一定要记得看看样例有多少组)

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int dp[][][];
int stamps[][][];
struct line{
int x,y;
friend bool operator<(line S,line T){
return S.y*T.x > T.y*S.x;
}
}li[];
int main()
{
int cases; cin>>cases;
int n,k;
for(int cas=;cas<=cases;cas++){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d",&li[i].x,&li[i].y);
for(int i=;i<=n;i++)
dp[i][][]=,stamps[i][][]=cas;
sort(li+,li+n+);
int t;
for(int i=;i<=n;i++){
int maxj=min(i,k),minj=max(,k-(n-i+));
for(int j=minj;j<=maxj;j++){
for(int y=;y>=;y--){
dp[i][j][y]=;
if(i>j && stamps[i-][j][y]>=cas) dp[i][j][y]=dp[i-][j][y], stamps[i][j][y]=cas;
if((y-li[i].y)>= && stamps[i-][j-][y-li[i].y]>=cas)
dp[i][j][y] = max(dp[i][j][y],dp[i-][j-][y-li[i].y]+(y+y-li[i].y)*li[i].x), stamps[i][j][y]=cas;
}
}
}
int ans=;
for(int y=;y>=;y--)
if(stamps[n][k][y]>=cas) ans=max(ans,dp[n][k][y]);
printf("Case %d: %d\n",cas,ans);
}
return ;
}

uva12589的更多相关文章

随机推荐

  1. 【简单项目框架一】Fragment实现的底部导航

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 我所做的项目涉及到比较多的是底部导航,今天我就把项目中使用的一种实现方式分享一下. 主要实现思路是:在一个Activity里面底部添加四个 ...

  2. CSS3中的弹性流体盒模型技术详解

    先回顾一下CSS1 和 CSS2中都已经定义了哪些布局方面的属性,这样也会增加我们理解弹性布局.   其实我们现在有很多一部分人,你们刚刚接触CSS层叠样式表,或者接触有一段时间了,但是却没有很好的去 ...

  3. css系列教程--文本

    text-align:规定文本的水平对齐方式.left/right/center/justify(两端对齐)/inherit(继承) text-decoration:添加到文本的效果.下划线,中间线等 ...

  4. UVA 1599 Ideal Path

    题意: 给出n和m,n代表有n个城市.接下来m行,分别给出a,b,c.代表a与b之间有一条颜色为c的道路.求最少走几条道路才能从1走到n.输出要走的道路数和颜色.保证颜色的字典序最小. 分析: bfs ...

  5. VMware虚拟机中调整Linux分区大小手记(转发)

      前段时间用VMware5.5安装了CentOS5.3,安装的时候分配了5Gb的虚拟硬盘空间给Linux系统,系统安装选择很多组件和软件,后面使用时又安装也一些软件,结果导致虚拟硬盘空间不足.查看分 ...

  6. python正则表达式练习篇

    练习一: 利用who命令输出所有已经登录系统的用户的信息,并把登录名.用户登录时的电传.登录时间.登录地址利用正则表达式分割开来. 数据的格式: %who wesc console Jun 20 20 ...

  7. SQL字符型字段按数字型字段排序实现方法(转)

    由于是按字母顺序排列,所以123排在了2的前面,显然不符合我们的要求,那么怎样才能按照我们预想的数字顺序排序呢 ORDER BY `meta_value`   那么按得分排序得到的结果可能是:1101 ...

  8. linux ARP攻击处理

    今天部门受到arp攻击 多说机器无法正常联网了,windows下的绑定下mac地址或者打开360arp防火墙就就ok了.我讲讲linux下的arp攻击的发现和处理吧.边学边讲,说的不对的欢迎大家指出, ...

  9. [转]Hibernate中property-ref的应用,常用来解决遗留数据库One To Many关系

    [转]Hibernate中property-ref的使用,常用来解决遗留数据库One To Many关系 1.如表Class(ClassID,Class_No,ClassName)与Student(S ...

  10. 学习使用Free RTOS ,移植最新的STM32 v3.5固件库

    最近拿到了一块万利的EK-STM32F的学习板,打算先用它来熟悉下STM32的编程环境,不过在这过程中和一个同事聊的时候觉得如果只调用STM32的库写程序,可能在芯片资源的利用上面可能就会差一点,在这 ...