1111
2024-07-10 19:16:48
发布于:浙江
动态规划
动态规划的做题三步骤为哪三步骤
根据前面算出来的最优解得出后面的最优解
- 确定状态 : 确定求解问题当中,每个子问题顶点的答案和含义
- 划分阶段 : 划分求解问题当中,哪些策略覆盖哪个范围,列清楚
- 确定状态转移方程 : 在某个顶点,适用哪些策略,写成表达式的形式呈现出来,则为状态转移方程。
题目意思
给定一个金字塔,你需要从金字塔顶端走到最底层任意一个顶点,期间每走过一格,都会累加上这个格子的数字,提问走到最底层的时候,最小累加的数字总额为多少?
解法
- 确定状态
- 假设。
- 划分阶段
- 我们将不存在的顶点都分配给一格无限大的数值,这样所有顶点除了起点之外都可以采用上方三个地方下来的数值了。
- 确定状态转移方程
#include<bits/stdc++.h>
using namespace std;
long long dp[305][305];
int n;
const long long INF = 1e18 + 7;
int main(){
for(int i = 0 ; i < 305 ; i ++ ){
for(int j = 0 ; j < 305 ; j ++ ){
dp[i][j] = INF;
}
}
cin >> n ;
for(int i = 1 ; i <= n ; i ++ ){
for(int j = 1 ; j <= i * 2 - 1 ; j ++ ){
cin >> dp[i][j];
if(i != 1){
dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j-2],dp[i-1][j]))+ dp[i][j];
}
}
}
long long answer = dp[n][1];
for(int j = 2 ; j <= n * 2 - 1 ; j ++ ){
answer = min(dp[n][j],answer);
}
cout << answer << endl;
return 0;
}
全部评论 2
方老师好厉害😝
2024-07-18 来自 浙江
0哎呦呵
2024-07-11 来自 广东
0















有帮助,赞一个