1150: 校门外的树 LV.4
时间限制: 1 Sec 内存限制: 64 MB提交: 81 解决: 11
题目描述
据说校门外的树是校长从皇家布鲁斯特(Blue Shit)挖掘机学院搞来的珍贵品种,一共有n棵。在第一天,每棵树价值ai元。但是从第二天开始,每棵树的价值都会飙升bi元。GX于是想出了一个生财之道:砍树。他在蹲局子之前有m天可以砍树,每天最多砍一棵树。
那么问题就来了,GX在蹲局子之后,可以最多为自己累计多少存款以度过余生?
输入
输入数据第一行是数据组数T。
对于每组数据。包含三行。
第一行是n,m。(0<m<=n<=250)
第二行有n个整数,为每棵树的ai。(1<=ai<=100)
第三行有n个整数,为每棵树的bi。(1<=bi<=100)
输出
对于每组数据:
每行一个整数,为GX度过余生的最多存款。
样例输入
22 110 101 12 28 102 3
样例输出
1021
提示
Author: 2013217098 潘 汀
很久以前写的dp- -也不知道咋写的
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long double LD;
const double PI = acos(-1.0);
///
struct node{
int a;
int b;
}st[300];
int cmp(struct node x,struct node y){
return x.b<y.b;
}
LL dp[300][300];
///
int main(int argc, char**argv) {
//ios_base::sync_with_stdio(0);cin.tie(0);
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>st[i].a;
}
for(int i=1;i<=n;i++){
cin>>st[i].b;
}
sort(st+1,st+n+1,cmp);
memset(dp,0,sizeof(dp));
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]+st[i].a+st[i].b*(j-1));
}
}
cout<<dp[n][m]<<endl;
}
//system("pause");
return 0;
}
//END
/**************************************************************
Problem: 1150
User: 2015217298
Language: C++
Result: 正确
Time:108 ms
Memory:2212 kb
****************************************************************/