自学内容网 自学内容网

GESP6级语法知识(二):动态规划算法(二)

最小路径和;

//最小路径和 
#include<iostream>
using namespace std;
const int N=100;
int dp[N][N],value[N][N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)//录入初始数字矩阵 
for(int j=1;j<=m;j++)
cin>>value[i][j];
for(int i=1;i<=n;i++)// 初始化最上方第一行 
dp[1][i]=dp[1][i-1]+value[1][i];
for(int i=1;i<=n;i++)// 初始化最左边第一列 
dp[i][1]=dp[i-1][1]+value[i][1]; 
for(int i=2;i<=n;i++)
for(int j=2;j<=m;j++)// 开始进行状态转移(即填写dp表) 
dp[i][j]=min(dp[i][j-1],dp[i-1][j])+value[i][j];
cout<<dp[n][m]<<endl; 
return 0;
}

最小路径和(一维数组):

#include<iostream>
using namespace std;
const int N=100000;
int dp[N];
int n,m;
int main()
{
int n,m,temp;
cin>>n>>m;
for(int i=1;i<=m;i++){//第一步:初始化 
cin>>temp;
dp[i]=dp[i-1]+temp;
}
for(int i=2;i<=n;i++)//第二步
{
cin>>temp;//得到当前值 
dp[1]+=temp;//第二步中的第①步:求第一个值 
for(int j=2;j<=m;j++){//第二步中的第②步:求其余值 
cin>>temp;
dp[j]=min(dp[j-1],dp[j])+temp;
}
}
cout<<dp[m];//输出最终结果 
return 0;
}

走方格:

#include<bits/stdc++.h>
using namespace std;
int n,m,dp[10005][10005];
int main()
{
        cin>>n>>m;
dp[0][0]=0;
        for(int i=1; i<=n; i++)
            dp[i][0]=1;
        for(int j=1; j<=m; j++)
            dp[0][j]=1;//初始化
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
            {
                dp[i][j]=dp[i-1][j]+dp[i][j-1];//动态规划转移方程
            }
        cout<<dp[n][m];
        return 0;
}

走方格(优化为一维数组)

#include<iostream>
using namespace std;
const int N=100000;
const int MOD=100000007;
int dp[N];
int n,m;
void DP()
{
dp[1]=1;// 初始化第一个格子
for(int i=1;i<=n;i++)// 通过二重循环遍历整个表单以更新dp[N]中的数据
for(int j=2;j<=m;j++)
dp[j]=(dp[j-1]+dp[j])%MOD;
}
int main()
{
cin>>n>>m;
DP();
cout<<dp[m];
return 0;
}

最长上升子序列:

#include<cstdio>
#include<algorithm>    //这个头文件可以使用max(,),*max_element(,)
using namespace std;    //它们的含义分别是:求两者最大;求数组最大
int n,a[1002],f[1002];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);   //输入
        f[i]=1;              //以第i个数为末尾的上升序列最初长度为1
    }
    for(int i=1;i<=n;i++)         //枚举i的位置
        for(int j=1;j<i;j++)   //在i的前面找j的位置
            if(a[i]>a[j]) //如果满足条件,则第i个数可以放在j后边
                f[i]=max(f[j]+1,f[i]);//取较大的一种再放
    printf("%d",*max_element(f+1,f+n+1));//从 F[1]到F[n] 找最大值
    return 0;
}


原文地址:https://blog.csdn.net/weixin_60445850/article/details/145281974

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!