不太懂这个方程有什么问题
查看原帖
不太懂这个方程有什么问题
967972
Rindong楼主2025/1/25 11:28

rt,感觉考虑的情况应该足够了

input:

10
0 1 5 2 0
6 0 0 2 0
0 4 2 3 0
1 4 1 1 1
0 2 4 0 6
0 5 1 1 0
3 2 1 2 2
2 4 0 4 0
2 3 1 1 1
1 2 3 0 2

正确输出:

8
8
11
10
22
4
16
13
10
12

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define stat dp[i][j][k][p][q]
int arr[105];
//第 i 个结尾,4人间用了 j 个,6 人间用了 k 个
//最后一个4人间剩下 p 个位置,最后一个6人间剩下q个位置
int dp[105][105][105][5][7];
int main() {
	int _;
	scanf("%d", &_);
	while (_--) {
		int n = 0;
		for (int i = 2; i <= 4; i++) {
			int cnt;
			scanf("%d", &cnt);
			while (cnt--) arr[n++] = i;
		}
		int a, b;
		scanf("%d%d", &a, &b);
		memset(dp, 0, sizeof dp);
		int ans = 0;
		for (int i = 0; i < n; i++) {
			int ai = arr[i];
			for (int j = 0; j <= a; j++)
				for (int k = 0; k <= b; k++)
					for (int p = 0; p <= 4; p++)
						for (int q = 0; q <= 6; q++) {
							//开一个新的4人房间
							dp[i + 1][j + 1][k][4 - ai][q] = max(dp[i + 1][j + 1][k][4 - ai][q],
								stat + ai);
							//开一个新的6人房间
							dp[i + 1][j][k + 1][p][6 - ai] = max(dp[i + 1][j][k + 1][p][6 - ai],
								stat + ai);
							//如果当前4人房还有空位
							if (j && ai <= p)
								dp[i + 1][j][k][p - ai][q] = max(dp[i + 1][j][k][p - ai][q],
									stat + ai);
							//如果当前6人房还有空位
							if (k && ai <= q)
								dp[i + 1][j][k][p][q - ai] = max(dp[i + 1][j][k][p][q - ai],
									stat + ai);
							dp[i + 1][j][k][p][q] = max(dp[i + 1][j][k][p][q], stat);
							ans = max(ans, dp[i][j][k][p][q]);
							printf("[%d %d %d %d %d] = %d\n", i, j, k, p, q, stat);
						}
		}
		for (int j = 0; j <= a; j++)
			for (int k = 0; k <= b; k++)
				for (int p = 0; p <= 4; p++)
					for (int q = 0; q <= 6; q++)
						ans = max(ans, dp[n][j][k][p][q]),
						printf("[%d %d %d %d %d] = %d\n", n, j, k, p, q, dp[n][j][k][p][q]);
		printf("%d\n", ans);
	}
	return 0;
}
2025/1/25 11:28
加载中...