记得开滚动数组 为什么不开就会少60分 没开滚动数组40pts:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
//#pragma G++ optimize(2)
//#pragma G++ optimize(3, "Ofast", "inline")
using namespace std;
long long s, n, m, num[105][105], num0[105][105], dp[105][20005], ans;
int main() {
freopen("1.in", "r", stdin);
//freopen("1.out", "w", stdout);
scanf("%lld %lld %lld", &s, &n, &m);
for(long long i = 1; i <= s; i++) {
for(long long j = 1; j <= n; j++) {
scanf("%lld", &num[j][i]);
}
}
for(long long i = 1; i <= n; i++) {
sort(num[i] + 1, num[i] + s + 1);
for(long long j = 1; j <= s; j++) {
num0[i][j] = num[i][j] * 2 + 1;
}
}
for(long long i = 1; i <= n; i++) {
for(long long j = 0; j <= m; j++) {
for(long long k = 0; k <= s && j >= num0[i][k]; k++) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - num0[i][k]] + k * i);
}
}
ans += dp[i][]
}
for(long long i = 0; i <= m; i++) {
ans = max(ans, dp[n][i]);
}
printf("%lld", ans);
return 0;
}
/*
num[i][j]表示第i座城堡,第j组兵的数量
num0[i][j]表示在第i座城堡,打败j个人的最小兵力
设dp[i][j]为考虑了前i座城堡,共花j个兵得到的最大分数
dp[i][j] = max(dp[i - 1][j], dp[i - 1][k] + Num);
k表示打败(0->n)个人的兵力花费
*/
开了的100pts:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
//#pragma G++ optimize(2)
//#pragma G++ optimize(3, "Ofast", "inline")
using namespace std;
long long s, n, m, num[105][105], num0[105][105], dp[20005], ans;
int main() {
//freopen("1.in", "r", stdin);
//freopen("1.out", "w", stdout);
scanf("%lld %lld %lld", &s, &n, &m);
for(long long i = 1; i <= s; i++) {
for(long long j = 1; j <= n; j++) {
scanf("%lld", &num[j][i]);
}
}
for(long long i = 1; i <= n; i++) {
sort(num[i] + 1, num[i] + s + 1);
for(long long j = 1; j <= s; j++) {
num0[i][j] = num[i][j] * 2 + 1;
}
}
for(long long i = 1; i <= n; i++) {
for(long long j = m; j >= 0; j--) {
for(long long k = 0; k <= s && j >= num0[i][k]; k++) {
dp[j] = max(dp[j], dp[j - num0[i][k]] + k * i);
}
}
}
printf("%lld", dp[m]);
return 0;
}