题目大意:给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. HTTP请求的基本概念 HTTP请求头和响应头的含义

    1,HTTP请求的基本概念    TCP/UPD/HTTP    *2,HTTP请求头和响应头的含义  请求头:  Accept: text/html,image/*(浏览器可以接收的类型)  Acc ...

  2. UVA 1613 K-Graph Oddity

    题意; 在一个n个点的无向连通图中,n是奇数,k是使得所有点的度数不超过k的最小奇数,询问一种染色方案,使得相邻点的颜色不同. 分析: k=所有点中最大的入度.如果最大入度是偶数,则k+1.每个点可选 ...

  3. sqlserver数据库三范式的理解

    从来都是听过概念,过一段时间就忘记了,根本就没有深入的理解.这次梳理一遍,用自己的方式记录一下. 1nf 原子性,不可拆分性 例如一张表里包含一个class属性(软件系,外语系,经贸系...)字段,这 ...

  4. S5700交换机配置端口镜像

    S5700交换机配置端口镜像 <Quidway>system-view    //进入系统视图 Enter system view, return user view with Ctrl+ ...

  5. ios消息的交互方式

    注意这些都是界面回传(即从第二个界面传到第一个界面,从第一个界面传到第二个界面的时候用第二个界面的属性即可)   iOS消息的交互方式有4种,分别为:通知,代理,block,kvo 现在我们对这个4中 ...

  6. openstack外篇之认识mysql授权及一些操作

    openstack外篇之认识mysql授权及一些操作  http://www.aboutyun.com/thread-11405-1-1.html

  7. BZOJ 3233: [Ahoi2013]找硬币( dp )

    dp(x)表示最大面值为x时需要的最少硬币数. 枚举x的质因数p,  dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ). ----------------- ...

  8. Activity关闭另一个Acitivity

    1.ActivityA跳转到ActivityB 2.ActivityB跳转到ActivityC 3.ActivityC结束掉自己的同时结束ActivityB 在ActivityB中声明一个自己的参数i ...

  9. Django模板-模板标签

    接着Django模板-基础知识继续写模板相关知识. if标签 {% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ). 但是不允许在同一个 ...

  10. struts2笔记11-OGNL

    1.OGNL Object-Graph Navigation Language,对象-图 导航语言,可以方便的操作struts2值栈对象 2.对象栈操作方法 (1)action普通属性的访问方法 &l ...