二維DP【洛谷P1508】
阿新 • • 發佈:2018-12-17
很簡單的一個題目,完全沒難度,但是我為啥要寫出來呢,因為剛開始我不會啊!
一直想著怎麼從起點往上搜,其實這題根本不需要,我們只需要從最上面往下跑,最後答案會落在起點那三個格子裡面的。
程式碼:
#include <bits/stdc++.h> using namespace std; const int maxn = 210; int G[maxn][maxn]; int dp[maxn][maxn]; void init() { memset(G,0,sizeof(G)); memset(dp,0,sizeof(dp)); } int main() { int n,m; cin>>m>>n; int x = m; int y = n/2+1; init(); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { cin>>G[i][j]; } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { dp[i][j] = max(max(dp[i-1][j],dp[i-1][j-1]),dp[i-1][j+1])+G[i][j]; } } cout<<max(max(dp[x][y-1],dp[x][y]),dp[x][y+1])<<endl; return 0; }