动态规划
2025-07-26 14:45:54
发布于:浙江
动态规划(DP)
解决 最值问题、方案数问题、可行性问题。
第一步:设动态规划数组(确定状态表示)
dp[i]
:第 步的方案数/走到第 步的最大最小花费
第二部:写出状态转移方程(递推式)
f[i]=f[i-1]+f[i-2]
第三步:输出答案
dp[n]
#include<bits/stdc++.h>
using namespace std;
const int N=45;
int dp[N];
int main(){
int n;
cin>>n;
dp[1]=1;
dp[2]=1;
for(int i=3;i<=n;i++)dp[i]=dp[i-1]+dp[i-2];
cout<<dp[n];
}
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N];
int dp[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dp[1]=a[1];
dp[2]=max(a[1],a[2]);
for(int i=1;i<=n;i++){
dp[i]=max(dp[i-1],dp[i-2]+a[i]);
}
cout<<dp[n]<<endl;
}
//走到第i个关卡所最多获得的知识点数
//dp[i]=dp[i-2]+a[i] 选
//dp[i]=dp[i-1] 不选
//最大值即:max(dp[i-1],dp[i-2]+a[i]);
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int dp[N];//dp[i]表示第i步的方案数
//dp[i]=dp[i-1]+dp[i-2]+......+dp[i-k];
int main(){
int n,k;
cin>>n>>k;
dp[1]=1;
dp[2]=1;
for(int i=3;i<=n;i++){
for(int j=1;j<=k;j++){
if(i-j<1)continue;
dp[i]=(dp[i]+dp[i-j])%114514;
}
}
cout<<dp[n]%114514;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=1010;
int dp[N][M];//表示横坐标为i,纵坐标为j的点有多少种方法走到对应位置。
//dp[i][j]=(dp[i-1][j]+dp[i][j-1])%114514
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)dp[i][1]=1;
for(int i=1;i<=m;i++)dp[1][i]=1;
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%114514;
}
}cout<<dp[n][m];
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N][N];
int dp[N][N];
//走到横坐标为i,纵坐标为j的最小路径和
//dp[i][j]=min(a[i][j]+dp[i-1][j-1],a[i][j]+dp[i-1][j]);
int main(){
int n;
cin>>n;
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}dp[1][1]=a[1][1];
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i][j]=min(a[i][j]+dp[i-1][j-1],a[i][j]+dp[i-1][j]);
}
}int ans=1e9;
for(int i=1;i<=n;i++){
ans=min(ans,dp[n][i]);
}cout<<ans;
}
这里空空如也
有帮助,赞一个