ZOJ 3211Dream City(dp)

来源:互联网 发布:大数据分析师笔试内容 编辑:程序博客网 时间:2024/06/15 01:01

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3211


书上有钱,一天砍一棵树,每天树上钱按一定速度增加  输出m天能收获最多的钱


先对输出的数据排序,一开始按照初始状态大到小,增长速度小到大的方法排序,结果是wa,最后只对增长速度排序。

#include<iostream>#include<cstdio>#include<set>#include<string>#include<string.h>#include<cstring>#include<vector>#include<map>#include<queue>#include<stack>#include<cctype>#include<algorithm>#include<sstream>#include<utility>#include<cmath>#define mt(a) memset(a,0,sizeof (a))#define fl(a,b,c) fill(a,b,c)#define SWAP(a,b,t) (t=a,a=b,b=t)#define inf 1000000000+7using namespace std;typedef struct tree{int start, up;}tree;typedef long long ll;int dp[300][300];tree t[300];int cut[300];int up[300];int start[300];bool com(tree x, tree y){//if(x.start != y.start)return x.start > y.start;return x.up < y.up;}int main(){int T;cin >> T;while (T--){mt(dp);mt(t);int n, m;scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++)scanf("%d", &t[i].start);for (int i = 1; i <= n; i++)scanf("%d", &t[i].up);sort(t + 1, t + n + 1, com);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] + t[i].start + t[i].up*(j - 1));}}printf("%d\n", dp[n][m]);}return 0;}

0 0
原创粉丝点击