ZOJ 3211 Dream City(DP)

来源:互联网 发布:平面设计用到哪些软件 编辑:程序博客网 时间:2024/06/01 08:34

本题是一个简单的0.1背包问题,但是由于每棵树的值在增长,所以增长快的要放在后面砍会比较有利。在做背包前,要先排个序

#include<stdio.h>#include<algorithm>using namespace std;struct Node{    int num;    int add;}a[300];int dp[300][300],ans;bool cmp(struct Node b,struct Node c){    return b.add<c.add;}void deal(int n,int m){    ans=-0x7f7f7f;    for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)            dp[i][j]=0;    for(int i=1;i<=n;i++){        for(int j=1;j<=m;j++){            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+(j-1)*a[i].add+a[i].num);            if(ans<dp[i][j]) ans=dp[i][j];        }    }}int main(){    int T,n,m;    while(~scanf("%d",&T)){        while(T--){            scanf("%d %d",&n,&m);            for(int i=1;i<=n;i++){                scanf("%d",&a[i].num);            }            for(int i=1;i<=n;i++){                scanf("%d",&a[i].add);            }            sort(a+1,a+n+1,cmp);            deal(n,m);            printf("%d\n",ans);        }    }    return 0;}/*22 110 101 12 210 83 2*/


0 0
原创粉丝点击