hrust 1913 小乐乐要下山 【数塔 + 打印路径】

小乐乐要下山
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 469(190 users) Total Accepted: 231(177 users) Rating: Special Judge: No
Description
上学的路总是那么艰辛,在小乐乐辛苦的出了家门之后,她才想起自己的家已经搬到山上了(睡的真迷糊)。下山的路同样十分艰难,不同的地方通行的难易程度也不同。如图所示,小乐乐现在在山顶上,她面前有两条路,每条路通往一个地点,每个地点有一个值,表示这个通行的难易程度。最底层的地点就是山脚了。大家知道,小乐乐好懒好懒的,她想知道怎么下山最省力?
Input
第一行一个整数n(1 随后n行,第i+1行有i个数字
表示山上的路况
Output
输出从山顶到山脚最省力的路。(保证答案唯一)
Sample Input
3
1
2 5
5 6 3
Sample Output
1 2 5
Hint

输入的是一个三角形,每个点能走到下面那个点和下右那个点。



打印路径只需要从上找dp的最大值即可;



#include
using namespace std;

int a[1111][1111];
int dp[1111][1111];

void best_answer(int i, int j, int n)
{
    if(i == n + 1)
        return;
    if(dp[i][j] < dp[i][j + 1])
    {
        if(i < n)
            printf("%d ",a[i][j]);
        else
            printf("%d\n",a[i][j]);
        best_answer(i + 1, j, n);
    }
    else
    {
        if(i < n)
            printf("%d ",a[i][j + 1]);
        else
            printf("%d\n",a[i][j + 1]);
        best_answer(i + 1, j + 1, n);
    }
}

int main()
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= i; j++)
                scanf("%d", &a[i][j]);
        for(int i = 1; i <= n; i++)
            dp[n][i] = a[n][i];
        for(int i = n - 1; i >= 1; i--)
            for(int j = 1; j <= i; j++)
                dp[i][j] = min(dp[i + 1][j], dp[i + 1][j + 1]) + a[i][j];
        printf("%d ", a[1][1]);
        best_answer(2, 1, n);
    }
    return 0;
}

你可能感兴趣的:(基础dp)