
2 4 3 55 32 75 17 69 73 54 81 63 47 5 45 6 6 51 57 49 65 50 74 33 16 62 68 48 61 2 49 76 33 32 78 23 68 62 37 69 39 68 59 77 77 96 59 31 88 63 79 32 34
Case 1 2 1 1 2 Case 2 3 2 1 1 2 1
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node
{
    int pos;
};
Node mark[110][110];//标记该位置是由 哪一位置得到的(自底往上)
int dp[110][110];
int N, M;
int k = 1;
void getMap()
{
    for(int i = 1; i <= N; i++)
    {
        for(int j = 1; j <= M; j++)
            scanf("%d", &dp[i][j]);
    }
}
void solve()
{
    int t;
    for(int i = N-1; i >= 1; i--)
    {
        for(int j = 1; j <= M; j++)
        {
            if(j == 1)
            {
                t = min(dp[i+1][j], dp[i+1][j+1]);//找到最小值
                dp[i][j] += t;
                //从左到右更新 前驱
                if(t == dp[i+1][j])
                    mark[i][j].pos = j;
                if(t == dp[i+1][j+1])
                    mark[i][j].pos = j + 1;
            }
            else if(j == M)
            {
                t = min(dp[i+1][j], dp[i+1][j-1]);
                dp[i][j] += t;
                if(t == dp[i+1][j-1])
                    mark[i][j].pos = j - 1;
                if(t == dp[i+1][j])
                    mark[i][j].pos = j;
            }
            else
            {
                int t = min(dp[i+1][j], min(dp[i+1][j-1], dp[i+1][j+1]));
                dp[i][j] += t;
                if(t == dp[i+1][j-1])
                    mark[i][j].pos = j-1;
                if(t == dp[i+1][j])
                    mark[i][j].pos= j;
                if(t == dp[i+1][j+1])
                    mark[i][j].pos = j+1;
            }
        }
    }
    int sx = 1;
    int Max = dp[1][1];
    for(int i = 2; i <= M; i++)
    {
        if(Max >= dp[1][i])//优先选择最右边的线
        {
            Max = dp[1][i];
            sx = i;
        }
    }
    printf("Case %d\n", k++);
    printf("%d", sx);
    int row = 1, cul = sx;//行号 列号
    while(1)
    {
        if(row == N) break;
        cul = mark[row][cul].pos;//下一列号
        printf(" %d", cul);
        row++;
    }
    printf("\n");
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d", &N, &M);
        getMap();
        solve();
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj 5092 Seam Carving 【树塔DP变形 + 路径输出】 【简单题】
原文:http://blog.csdn.net/chenzhenyu123456/article/details/47656489