关于两个动态转移方程的顺序
查看原帖
关于两个动态转移方程的顺序
561708
long_int楼主2021/9/11 14:51

本题共有两个转移方程:

  1. dpj=max(dpj+losei,dpjusei+wini)dp_j=\max(dp_j+lose_i,dp_{j-use_i}+win_i)
  2. dpj=dpj+loseidp_j=dp_j+lose_i

为什么先对第一个方程操作、再对第二个方程操作可以 AC,而反过来却不行呢?

ACCodeAC Code

#include <stdio.h>
#pragma warning (disable : 4996)
#define maxn 2005
#define LL long long
LL n, x;
LL lose[maxn], win[maxn], use[maxn], dp[maxn];
LL max(LL a, LL b) { return a > b ? a : b; }
int main() {
	scanf("%lld%lld", &n, &x);
	for (int i = 1; i <= n; i++)
		scanf("%lld%lld%lld", &lose[i], &win[i], &use[i]);
	for (int i = 1; i <= n; i++) {
		for (int j = x; j >= use[i]; j--)
			dp[j] = max(dp[j] + lose[i], dp[j - use[i]] + win[i]);
		for (int j = use[i] - 1; j >= 0; j--)
			dp[j] = dp[j] + lose[i];
	}
	printf("%lld", dp[x] * 5);
	return 0;
}

WACodeWA Code:

#include <stdio.h>
#pragma warning (disable : 4996)
#define maxn 2005
#define LL long long
LL n, x;
LL lose[maxn], win[maxn], use[maxn], dp[maxn];
LL max(LL a, LL b) { return a > b ? a : b; }
int main() {
	scanf("%lld%lld", &n, &x);
	for (int i = 1; i <= n; i++)
		scanf("%lld%lld%lld", &lose[i], &win[i], &use[i]);
	for (int i = 1; i <= n; i++) {
		for (int j = use[i] - 1; j >= 0; j--)
			dp[j] = dp[j] + lose[i];
		for (int j = x; j >= use[i]; j--)
			dp[j] = max(dp[j] + lose[i], dp[j - use[i]] + win[i]);
	}
	printf("%lld", dp[x] * 5);
	return 0;
}

两个循环为什么不能更换位置呢?

2021/9/11 14:51
加载中...