洛谷P1216—[USACO1.5][IOI1994]數字三角形 Number Triangles題解

傳送門

首先,這個題用貪心是確定作不出來滴!ios

那麼用什麼方法作呢?數組

我要是知道我就不看題解了!spa

思路是——code

DP+dfs!

狀態轉移方程:

\[f[x][y]=a[x][y]+max(f[x+1,y],f[x+1,y+1]) \]

從最上層開始向下搜索,搜到最底層後回溯就能夠了ci

不要忘記判斷邊界

代碼以下:get

#include<iostream>
#include<cstring>
using namespace std;
int r,a[1005][1005];
int mem[1005][1005];//記憶化數組
int dfs(int x,int y)
{
    if(x>=r-1)//邊界判斷
                return a[x][y];
    if(mem[x][y]>-1)return mem[x][y];//記憶化
    return mem[x][y]=a[x][y]+max(dfs(x+1,y),dfs(x+1,y+1));//狀態轉移方程
}
int main()
{
    memset(mem,-1,sizeof(mem));//初始化記憶數組
    cin>>r;
    for(int i=0;i<r;i++)
        for(int j=0;j<=i;j++)cin>>a[i][j];//輸入數組
    cout<<dfs(0,0);//從最上層開始搜
    return 0;
}

2020/12/24 添加了狀態轉移方程

蟹蟹觀看!

相關文章
相關標籤/搜索