next居然是关键字,
多段图DP
#include <cstdio>
#include <iostream>
#include <climits>
#include <algorithm>
using namespace std;
const int MAXM = 10;
const int MAXN = 100;
const int INF = INT_MAX;
int m, n;
int a[MAXM][MAXN], dp[MAXM][MAXN], mynext[MAXM][MAXN];;
void solve()
{
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
dp[i][j] = INF;
}
}
for (int i = 0; i < m; i++) {
dp[i][n - 1] = a[i][n - 1];
}
for (int j = n - 2; j >= 0; j--) {
for (int i = 0; i < m; i++) {
int rows[3] = {i, i-1, i+1};
if (i == 0) rows[1] = m - 1;
if (i == m - 1) rows[2] = 0;
sort(rows, rows + 3);
for (int k = 0; k < 3; k++) {
int v = dp[rows[k]][j + 1] + a[i][j];
if (v < dp[i][j]) {
dp[i][j]= v;
mynext[i][j] = rows[k];
}
}
}
}
int ans = INF, first;
for (int i = 0; i < m; i++) {
if (dp[i][0] < ans) {
first = i;
ans = dp[i][0];
}
}
printf("%d", first + 1);
for (int i = mynext[first][0], j = 1; j < n; i = mynext[i][j], j++) {
printf(" %d", i + 1);
}
printf("\n%d\n", ans);
}
int main()
{
//freopen("input.txt", "r", stdin);
while (scanf("%d%d", &m, &n) != EOF) {
solve();
}
}