题目:
解题思路:
可以定义函数F(i,j)是源点(1,1)到点(i,j)的最大值,val(i,j)是点(i,j)的数值;
先求出状态转移方程:
F(i,j)= max((i-1,j-1),(i-1,j))
题解代码:
根据状态转移方程敲出代码即可;
//数字三角形--DP
#include <bits/stdc++.h>
using namespace std;
const int maxx = 100;
int val[maxx+5][maxx+5];
int bes[maxx+5][maxx+5];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i){
for(int j=1;j<=i;++j){
cin>>val[i][j]; //读取数据
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=i;++j){
bes[i][j]=max(bes[i-1][j],bes[i-1][j-1])+val[i][j];
}
}
int maxxx = -1;
for(int i=1;i<=n;++i){
if(bes[n][i]>maxxx)
maxxx = bes[n][i];
}
cout<<maxxx<<endl;
return 0;
}
最关键的是---状态转移方程
我就是喜欢用二维DP数组,容易理解