NC229636. 人生重开模拟器
描述
输入描述
本题为多组测试数据,第一行输入一个整数T(),表示测试数据的组数。
对于每组数据,第一行输入三个整数n,x,m(;),代表玩家需要从n个天赋中选出x个天赋,所获得属性点分配给m个属性。
第二行依次输入n个正整数 ,,... ,(),代表每个天赋对应的属性点,所选天赋的属性点之和记为s。
接下来输入m行,每行输入s个正整数 ,,... ,(),代表给当前属性加i个属性点可获得点能力值。
输出描述
对于每组测试数据,一行输出一个整数代表小咸鱼最多得到的能力值。如果给某属性加的属性点为0,那通过此属性所得到能力值为0。
示例1
输入:
1 10 3 2 1 2 3 1 1 2 2 1 0 1 1 1 2 3 1 1 2 1 3 2 1 2 2 2
输出:
6
C++ 解法, 执行用时: 118ms, 内存消耗: 876K, 提交时间: 2021-11-07 13:50:06
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int T,n,m,x,s,v[150],c[150][1005],f[150][150],ans; int main() { scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&x,&m); for(int i=1;i<=n;i++) scanf("%d",&v[i]); sort(v+1,v+n+1);s=ans=0; for(int i=n;i>=n-x+1;i--) s+=v[i]; for(int i=1;i<=m;i++) for(int j=1;j<=s;j++) scanf("%d",&c[i][j]),f[i][j]=0; for(int k=1;k<=m;k++) for(int i=0;i<=s;i++) for(int j=0;j<=i;j++) f[k][i]=max(f[k][i],f[k-1][j]+c[k][i-j]); for(int i=0;i<=s;i++) ans=max(ans,f[m][i]); printf("%d\n",ans); } return 0; }