LIS(最长上升子序列)
for (int i = 1; i <= n; i++)
{
f[i] = 1;
for (int j = 1; j < i; j++)
if (a[j] < a[i]) f[i] = max(f[i], f[j] + 1);
}
LCS(最长公共子序列)
memset(f, 0, sizeof f);
for(int i = 1; i <= l1; i++)
for(int j = 1; j <= l2; j++)
if(a[i - 1] == b[j - 1]) f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);
else f[i][j] = max(f[i][j - 1], f[i - 1][j]);
printf("%d\n", f[l1][l2]);
LCIS(最长公共上升子序列)
for (int i = 1; i <= n; i++)
{
int val = 0;
if (b[0] < a[i]) val = f[i - 1][0];
for (int j = 1; j <= n; j++)
{
if (a[i] == b[j]) f[i][j] = val + 1;
else f[i][j] = f[i - 1][j];
if (b[j] < a[i]) val = max(val, f[i - 1][j]);
maxx = max(f[i][j], maxx);
}
}
cout << maxx << endl;
0/1背包
memset(f, 0xcf, sizeof f);
f[0] = 0;
for (int i = 1; i <= n; i++)
for (int j = m; j >= w[i]; j--)
f[j] = max(f[j], f[j - w[i]] + v[i]);
int ans = 0;
for (int j = 0; j <= m; j++)
ans = max(ans, f[j]);
完全背包
memset(f, 0xcf, sizeof f);
f[0] = 0;
for (int i = 1; i <= n; i++)
for (int j = w[i]; j <= m; j++)
f[j] = max(f[j], f[j - w[i]] + v[i]);
int ans = 0;
for (int j = 0; j <= m; j++)
ans = max(ans, f[j]);
多重背包
cin >> n >> v;
for (int i = 1; i <= n; i++)
scanf("%d%d%d", &m[i], &w[i], &s[i]);
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++)
{
int x = m[i], y = 1;
while (x >= y)
{
for (int j = v; j >= y * w[i]; j--)
f[j] = max(f[j], f[j - w[i] * y] + s[i] * y);
x = x - y;
y = y * 2;
}
if (x >= 1)
{
for (int j = v; j >= w[i] * x; j--)
f[j] = max(f[j], f[j - w[i] * x] + s[i] * x);
}
}
cout << f[v] << endl;
分组背包
memset(f, 0xcf, sizeof f);
f[0] = 0;
for (int i = 1; i <= n; i++)
for (int j = m; j >= 0; j--)
for (int k = 1; k <= c[i]; k++)
if (j >= w[i][k]) f[j] = max(f[j], f[j - w[i][k]] + v[i][k]);