You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.3 KiB
57 lines
1.3 KiB
#include <bits/stdc++.h>
|
|
|
|
using namespace std;
|
|
const int N = 30;
|
|
|
|
int n, m;
|
|
int w[N][N];
|
|
int f[N][N];
|
|
int path[N][N];
|
|
|
|
//致敬墨染空大神
|
|
void out(int i, int j) {
|
|
if (i == 0) return; //走出界就完事了
|
|
int k = path[i][j];
|
|
out(i - 1, j - k); //利用递推的栈机制,后序输出,太强了~
|
|
printf("%d %d\n", i, k);
|
|
}
|
|
|
|
int main() {
|
|
scanf("%d %d", &n, &m);
|
|
for (int i = 1; i <= n; i++)
|
|
for (int j = 1; j <= m; j++)
|
|
scanf("%d", &w[i][j]);
|
|
|
|
/*1、原始版本*/
|
|
for (int i = 1; i <= n; i++)
|
|
for (int j = 0; j <= m; j++) {
|
|
f[i][j] = f[i - 1][j];
|
|
path[i][j] = 0;
|
|
for (int k = 1; k <= j; k++) {
|
|
int val = f[i - 1][j - k] + w[i][k];
|
|
if (val >= f[i][j]) {
|
|
f[i][j] = val;
|
|
path[i][j] = k;
|
|
}
|
|
}
|
|
}
|
|
/*2、优化一下代码*/
|
|
/*
|
|
for (int i = 1; i <= n; i++)
|
|
for (int j = 0; j <= m; j++) {
|
|
for (int k = 0; k <= j; k++) {
|
|
int val = f[i - 1][j - k] + w[i][k];
|
|
if (val >= f[i][j]) {
|
|
f[i][j] = val;
|
|
path[i][j] = k;
|
|
}
|
|
}
|
|
}*/
|
|
|
|
//输出最大值
|
|
printf("%d\n", f[n][m]);
|
|
//输出路径
|
|
out(n, m);
|
|
|
|
return 0;
|
|
} |