UVA12589_Learning Vector

大致题意:

有n个向量要你选k个,把这k个向量连起来,画出来的与x轴围成的面积最大

思路:

这个是斜率dp,让斜率大的排在前面,记忆化搜索的时候要加入一个当前高的信息,因为这个向量形成面积不仅和斜率有关还有当前高有关

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 60;
struct node{
    int x;
    int y;
}vec[maxn];
int t,k,n,kase;
int d[maxn][maxn][maxn*maxn];
int vis[maxn][maxn][maxn*maxn];
bool cmp(const node& a,const node& b){
    return a.y*b.x>a.x*b.y;
}
int dfs(int id,int cnt,int h){
    if(cnt==k) return 0;
    if(id==n+1) return 0;
    int &ans = d[id][cnt][h];
    if(vis[id][cnt][h]==kase) return ans;
    ans=0;vis[id][cnt][h]=kase;
    ans=max(ans,dfs(id+1,cnt,h));
    int add=2*h*vec[id].x+vec[id].x*vec[id].y;
    ans=max(ans,dfs(id+1,cnt+1,h+vec[id].y)+add);
    return ans;
}
int main(){
    cin>>t;
    for(kase=1;kase<=t;++kase){
        cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>vec[i].x>>vec[i].y;
        sort(vec+1,vec+n+1,cmp);
        printf("Case %d: %d\n",kase,dfs(1,0,0));

    }
    return 0;
}


posted @ 2015-09-09 17:20  盗版柯南  阅读(108)  评论(0编辑  收藏  举报