C++动态规划-第二弹_ios

C++动态规划-第二弹_ios_02

嚯,这是什么奇怪的题目C++动态规划-第二弹_动态规划_03

C++动态规划-第二弹_ios_04

C++动态规划-第二弹_#include_05

这样可以递归:

// Author:PanDaoxi
#include <iostream>
using namespace std;
int f(int i,int j){
if(i==1||j==1) return 1;
else return f(i-1,j)+f(i,j-1);
}
int main(){
int n,m;
cin>>n>>m;
cout<<f(n,m);
return 0;
}

也可以使用动规:

// Author:PanDaoxi
#include <iostream>
using namespace std;
//动态规划
int pathSum_DP(int i,int j){
if(i==1||j==1) return 1;
const int x=i,y=j;
int dp[x+1][y+1]={};
for(int k=1;k<=i;k++){
dp[k][1]=1;
}
for(int l=1;l<=j;l++){
dp[1][l]=1;
}
//核心
for(int k=2;k<=i;k++){
for(int l=2;l<=j;l++){
dp[k][l]=dp[k-1][l]+dp[k][l-1];
}
}
return dp[i][j];
}
int main(){
int n,m;
cin>>n>>m;
cout<<pathSum_DP(n,m);
return 0;
}

再次优化为一维数组:

// Author:PanDaoxi
#include <iostream>
using namespace std;
int pathSum_DP(int m,int n){
if(m==1||n==1) return 1;
const int x=n;
//再次优化
int dp[x+1]={};
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i==1||j==1) dp[j]=1;
else dp[j]=dp[j]+dp[j-1];
}
}
return dp[n];
}
int main(){
int m,n;
cin>>m>>n;
cout<<pathSum_DP(m,n);
return 0;
}