社区讨论

听灌佬多

灌水区参与者 5已保存回复 18

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@m3cpp3fd
此快照首次捕获于
2024/11/11 15:38
去年
此快照最后确认于
2025/11/05 01:32
4 个月前
查看原帖
我发现了一个很神奇的现象:只要将以下代码dp数组中的N和M对调且下面对应的i和j也对调同个大样例原代码0.5s就能跑完而对调后要跑1.2s,貌似时间复杂度变大了但不知道变大在何处,有大佬能解释一下吗qwq
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105,M = 2e5 + 5;
ll n,m,k,s,ans,v[N],w[N],dp[N][M][2];
inline ll read()
{
	ll x = 0,f = 1;
	char c = getchar();
	while (!isdigit(c))
	{
		if (c == 45)
			f = -1;
		c = getchar();
	}
	while (isdigit(c))
	{
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return x * f;
}
inline void print(ll x)
{
	if (x < 0)
	{
		putchar(45);
		x = -x;
	}
	if (x > 9)
		print(x / 10);
	putchar(x % 10 ^ 48);
}
inline ll max(ll a,ll b)
{
	return a > b ? a : b;
}
int main()
{
	freopen("item.in","r",stdin);
	freopen("item.out","w",stdout);
	n = read(),m = read(),k = read();
	for (register int i = 0;i++ < n;v[i] = read(),w[i] = read());
	for (register int i = 0;i++ < n;)
		for (register int j = m;j >= 0;j--)
		{
			dp[i][j][0] = max(dp[i - 1][j][0],dp[i - 1][j][1]);
			if (v[i] > j)
				continue;
			dp[i][j][1] = max(dp[i - 1][j][0],max(dp[i - 1][j - v[i]][0] + w[i],dp[i - 1][j - v[i]][1] + w[i] - k));
		}
	print(max(dp[n][m][0],dp[n][m][1]));
	return 0;
}

回复

18 条回复,欢迎继续交流。

正在加载回复...