40pts进食后人+一个疑问
查看原帖
40pts进食后人+一个疑问
690561
违规用户名690561楼主2024/11/3 16:36

记得开滚动数组 为什么不开就会少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;
}
2024/11/3 16:36
加载中...