二维线性DP 框架代码见下
cpp
#include <iostream>
using namespace std;
#define maxn 110
int mat[maxn][maxn];
int dp[maxn][maxn];
int main()
{
int n;
cin >> n;
for(int i=0; i<n; ++i){
for(int j=0; j<=i; ++j){
cin >> mat[i][j];
}
}
dp[0][0] = mat[0][0];
for(int i=0; i<n; ++i){
dp[i][i] = mat[i][i] + dp[i-1][i-1];
dp[i][0] = mat[i][0] + dp[i-1][0];
for(int j=1; j<i; ++j){
dp[i][j] = mat[i][j] + max(dp[i-1][j-1], dp[i-1][j]);
}
}
int ans = dp[n-1][0];
for(int i=1; i<n; ++i){
ans = max(ans, dp[n-1][i]);
}
cout << ans << endl;
// 请在此输入您的代码
return 0;
}
代码练习1 对应蓝桥云课 云神的路径 代码见下
cpp
#include <iostream>
using namespace std;
#define mod 1000000007
#define maxn 1001
char s[maxn][maxn];
int dp[maxn][maxn];
int main()
{
int n;
cin >> n;
for(int i=0; i<n; ++i){
cin >> s[i];
}
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
if(s[i][j] == '*'){
dp[i][j] = 0;
}else{
if(i==0 && j ==0){
dp[i][j] = 1;
}else if(i == 0){ // 从左边过来
dp[i][j] = dp[i][j-1];
}else if(j == 0){ // 从上边过来
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = (dp[i][j-1]+dp[i-1][j]) % mod;
}
}
}
}
cout << dp[n-1][n-1] << endl;
// 请在此输入您的代码
return 0;
}
代码 2 对应蓝桥云课 激光样式 代码见下
cpp
#include <iostream>
using namespace std;
int dp[31][2];
int main()
{
dp[1][0] = 1;
dp[1][1] = 1;
for(int i=2; i<=30; ++i){
dp[i][0] = dp[i-1][0] + dp[i-1][1];
dp[i][1] = dp[i-1][0];
}
cout << dp[30][0] + dp[30][1] << endl;
// 请在此输入您的代码
return 0;
}