从集合角度分析DP问题(课程笔记,来自y总的思想)
AC代码
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int N = 510;
int main(){
int n,arr[N][N],dp[N][N]; ///n--数目 arr--存数字三角形 dp--dp数组
cin>>n;
for(int i=1;i<=n;++i){ ///从1到n
for(int j=1;j<=i;++j){
cin>>arr[i][j];
}
}
for(int i=1;i<=n;++i){ ///边界初始化
dp[n][i]=arr[n][i];
}
for(int i=n-1;i>=1;--i){ ///从下往上算避免特殊点的讨论
for(int j=1;j<=i;++j){
dp[i][j]=arr[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
}
}
cout<<dp[1][1];
return 0;
}
相关题目
AcWing 1015. 摘花生
AcWing 1027. 方格取数
AcWing 382. K取方格数