题目大意:给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. SharePoint Search之(一):创建Search服务应用程序

    计划写一个关于怎样使用SharePoint Search的系列,包括下面几个方面: (一)创建Search Service Application (二)持续爬网(continues crawl) ( ...

  2. chrome浏览器的桌面通知

    最近在使用朋友网(不加链接,避免有打广告的嫌疑),发现会出现提示“是否允许网站显示桌面通知?”,如下图所示: 这种做法,在页面加载完时直接调用请求,比起开心网的这种提示感觉有些野蛮了.开心网的桌面通知 ...

  3. 普通用户登录Oracle DB Control

    使用 sys 或者 system 用户登录 Oracle DB Control 是没有问题的. 但是,如果是普通的用户需要登录Oracle DB Control,建表或者视图之类的, 则需要授权 SE ...

  4. 几个Python oj的网站

    http://www.rqnoj.cn/ http://www.pythontip.com/

  5. Oracle的汉字转拼音首字母的函数

    CREATE OR REPLACE FUNCTION F_PINYIN(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS V_COMPARE VARCHAR2(100); ...

  6. (转)DataTable添加行出现“该行已经属于另一个表”的错误!

    1 DataTable dt1 = new DataTable(); DataTable dt2 = new DataTable(); //为dt1创建结构 DataColumn pName = ne ...

  7. js/jquery获取当前页面URL地址并判断URL字符串中是否包含某个具体值

    js/jquery获取当前页面URL地址并判断URL字符串中是否包含某个具体值本文介绍jquery/js获取当前页面url地址的方法,在jquery与js中获取当前页面url方法是一样的,因为jque ...

  8. Android源码下载

    Android源码下载 1.安装git 2.安装repo 从这里 https://dl-ssl.google.com/dl/googlesource/git-repo/repo 下载repo文件 3. ...

  9. Delphi使用Windows API函数AnimateWindow实现窗体特效

    {**********************************************************************API函数 AnimateWindow 使用:函数功能:窗 ...

  10. 【OpenGL游戏开发之三】OpenGl核心函数库汇总

    OpenGl核心函数库 glAccum 操作累加缓冲区 glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形 glAlphaFunc允许设置alpha检测功能 glA ...