题目链接:点击打开链接
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 105 , inf = 1e9 ;
int d[15][maxn] , m , n , a[15][maxn], N[15][maxn] ;
int main()
{
int ans ;
//freopen("a.txt" , "r" , stdin) ;
while(scanf("%d%d" , &m , &n) != EOF)
{
ans = inf ;
for(int i = 0 ; i < m ; i ++)
{
for(int j = 0 ; j < n ; j ++)
scanf("%d" , &a[i][j]) ;
}
int first = 0 ;
for(int j = n - 1 ; j >= 0 ; j --) //j必须放在外层 ,第n-1层只由n-2层决定
{
for(int i = 0 ; i < m ; i ++)
{
if(j == n - 1) d[i][j] = a[i][j] ;
else
{
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) ;
d[i][j] = inf ;
for(int k = 0 ; k < 3 ; k ++)
{
int v = d[rows[k]][j + 1] + a[i][j] ;
if(v < d[i][j])
{
d[i][j] = v ;
N[i][j] = rows[k] ;
}
}
}
}
}
for(int i = 0 ; i < m ; i ++)
{
if(d[i][0] < ans)
{
ans = d[i][0] ;
first = i ;
}
}
printf("%d" , first + 1) ;
for(int i = N[first][0] , j = 1 ; j < n ; i = N[i][j] , j ++)
printf(" %d" , i + 1 ) ;
printf("\n%d\n" , ans) ;
}
return 0;
}