题目描述
题解
这是一道经典的动态规划入门题目,列出状态转移方程是至关重要的!
d
p
(
i
,
j
)
=
m
a
x
(
d
p
(
i
−
1
,
j
)
,
d
p
(
i
−
1
,
j
−
1
)
)
+
a
(
i
,
j
)
.
dp(i,j) = max(dp(i-1,j),dp(i-1,j-1))+a(i,j).
dp(i,j)=max(dp(i−1,j),dp(i−1,j−1))+a(i,j).
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − 1 ] ) + a [ i ] [ j ] . dp[i][j] = max(dp[i-1][j],dp[i-1][j-1])+a[i][j]. dp[i][j]=max(dp[i−1][j],dp[i−1][j−1])+a[i][j].
#include<bits/stdc++.h>
using namespace std;
const int N = 1001;
int a[N][N],dp[N],ans,n;
//列状态转移方程
//dp[i][j] = max{dp[i-1][j],dp[i-1][j-1]}+a[i][j]
int main(){
cin>>n;
//输入二维数组
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
//动态规划算法
dp[1]=a[1][1];
for(int i=2;i<=n;i++){
for(int j=i;j>=1;j--){
dp[j] = max(dp[j],dp[j-1])+a[i][j];//dp用一维数组,只考虑列
}
}
//找最大带权路径
for(int i=1;i<=n;i++){
if(dp[i]>ans) ans=dp[i];
}
cout<<ans;
return 0;
}
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
30