1. 程式人生 > 其它 >動態規劃 c++ 數字三角形

動態規劃 c++ 數字三角形

技術標籤:dp演算法

動態規劃 c++ 數字三角形


今天帶來一道動態規劃題,適合剛接觸演算法的新手。話不多說,直接上題!


  • Description
    在這裡插入圖片描述

  • Format Input
    第一行一個整數N(<=1000),表示三角形總共有幾行 第二至第N+1行,給出這個數字三角形
  • Format Output
    一個整數,表示一路上所有數的最大和,結果不會超過int64

  • Sample Input
    4
    1
    3 2
    4 10 1
    4 3 2 20
  • Sample Output
    24

沒學過dp的碼友看完題是不是一臉懵?沒關係,接下來我呈上自己的思路

先看題目。我們做程式設計題的主要思路中,有一個很重要的思路,就是從小推到大。那在這題中使用:

首先一層的情況不用討論,相信有腦子的都會

然後看兩層,我們是從上往下走求和,那就有兩種方法:向左~ 向右~ 然後取一個更大的。

那麼很明顯,需要用一個數組存下從最高層走到這個點上的最大數字和。這裡用f[i][j]表示從第一行第一列到第i行第j列的最大數字和。這樣,動態規劃的第一個要點:所求狀態就明確了。


然後接下來要求的是狀態轉移方程。f[i][j]可能是從左上f[i-1][j-1]來的,也可能是從右上f[i-1][j]來的,而我們要求的是最大答案,所以要用到一個max函式。

{
	f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j])//這裡a陣列是輸入
}

這樣,狀態轉移方程也得到了


最後還要確定的兩點是f陣列最開始要確定的數,還有答案是什麼。

那麼第一點,f初始值很明顯,f[1][1]=a[1][1](作者習慣從1開始),即頂點數字和最大值就是輸入值

f[1][1]=a[1][1];

第二點,答案,是最後一行的每個和的最大值

int ans=0;
for(int i=1;i<=n;i++)
{
	ans=max(ans,f[n][i]);
}

最後,把前面程式碼串起來加個輸入,最後的原始碼就出來了:

#include<bits/stdc++.h>
using namespace std;
int n,a[1000][1000]
,f[1000][1000]; int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { cin>>a[i][j]; } } f[1][1]=a[1][1]; for(int i=2;i<=n;i++) { for(int j=1;j<=i;j++) { f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j]; } } int ans=0; for(int j=1;j<=n;j++) { ans=max(ans,f[n][j]); } cout<<ans; return 0; }

最後還是求一波點贊支援!!!作者敲鍵盤也很累的OK!!!一遍看不懂的多看幾遍消化消化,實在還不動評論區告訴我!!!