我发现了一个很神奇的现象:只要将以下代码dp数组中的N和M对调且下面对应的i和j也对调同个大样例原代码0.5s就能跑完而对调后要跑1.2s,貌似时间复杂度变大了但不知道变大在何处,有大佬能解释一下吗qwq
#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;
}