uva12589
题目大意:给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的更多相关文章
随机推荐
- 【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之四】使用绑定C++至Lua的自己定义类
续[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三]动手绑定自己定义类至Lua 之后.我们已经完毕了自己定义类至Lua的绑定.在接下来的环节,我们将使用它. 首先,我们须要确定 ...
- 依赖注入及AOP简述(六)——字符串请求模式 .
2. 依赖注入对象的请求模式 前一节我们讨论了关于声明注入点的几种方法,这一节主要来介绍在注入点上如何定位到所需要的标识符的话题.基本上,我们可以用字符串为标识符来请求依赖对象.或者用全类名( ...
- URAL 1736 Chinese Hockey 网络流+建图
题目链接:点击打开链接 题意: 给定n个队伍的得分情况,输出随意一个可行解. n个队伍随意2个队伍 a, b 间有且仅有一场比赛. 比赛结果分4种: 1.a +3, b +0 2.a +0, b +3 ...
- (转)ASP.NET缓存概念及其应用浅析
ASP.NET缓存概念及其应用浅析 ASP.NET缓存是什么呢?ASP.NET缓存有什么样子的特点呢?本文就向你详细介绍ASP.NET缓存的相关情况. ASP.NET缓存概念是什么呢?通常,应用程序可 ...
- VirtualBox镜像复制载入
转发:http://blog.csdn.net/dotuian/article/details/9127229 一,虚拟镜像文件格式 VirtualBox磁盘镜像文件(VDI, VMDK, VHD, ...
- android开发时间和日期的代码实现工具类(一)
android开发时间和日期工具类的代码实现: package com.gzcivil.utils; import android.annotation.SuppressLint; import an ...
- hdu2368Alfredo's Pizza Restaurant
Problem Description Traditionally after the Local Contest, judges and contestants go to their favour ...
- android 后台运行
改写返回键事件监听,使得back键功能类似home键,让Acitivty退至后台时不被系统销毁,代码如下: public boolean onKeyDown(int keyCode, KeyEvent ...
- 一个周末掌握IT前沿技术之node.js篇
一个周末掌握IT前沿技术之node.js篇 http://ittechnical.sinaapp.com/node-js-and-restful-api/ NodeJS入门 http://www.n ...
- 编译安装apache2.4
一.编译安装apache2.4Apache官方说:与Apache 2.2.x相比,Apache 2.4.x提供了很多性能方面的提升,包括支持更大流量.更好地支持云计算.利用更少的内存处理更多的并发等. ...