動態規劃 c++ 數字三角形
阿新 • • 發佈:2020-12-28
動態規劃 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!!!一遍看不懂的多看幾遍消化消化,實在還不動評論區告訴我!!!