动态规划-基础练习

洛谷 P1255

 https://www.luogu.com.cn/problem/P1255

程序模板:

#include<bits/stdc++.h>
using namespace std;
#define SIZE 15001
string gaoPlus(string aa,string bb) {
    int i, t;
    if (aa.size() < bb.size()){// 两个字符串的长度不一样,要添0
        t = aa.size();
        for (i = 1; i <= bb.size() - t; i++){
            aa = "0" + aa;
        }
    }else{
        t = bb.size();
        for (i = 1; i <= aa.size() - t; i++){
            bb = "0" + bb;
        }
    }
    for (i = aa.size() - 1; i >= 0; i--){// 开始加法
        aa[i] += bb[i] - '0';
        if (aa[i] > '9'){
            if (i){
                aa[i] -= 10;
                aa[i-1]++;
            }else{
                aa[i] -= 10; // 最高位进位
                aa = "1" + aa;
            }
        }
    }
    return aa;
}
string a[SIZE];
int main(){
    int n, i;
    cin >> n;
    a[0] = "0";
    a[1] = "1";
    a[2] = "2";
    for (i = 3; i <= n; i++){
        a[i] = gaoPlus(a[i-1],a[i-2]);//当前数为前两个数之和  高精度加法 
    }
    cout<<a[n]; // 输出
    return 0;
}

 

洛谷 P1216

 https://www.luogu.com.cn/problem/P1216

程序模板:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
 
int a[1001][1001];
int dp[1001][1001];
 
int main(){
    int n;
    cin>>n;
    for(int i=1;i<= n;i++)
        for(int j=1;j<=i;j++)
            cin>>a[i][j];//输入数字三角形所有数
             
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            //每走一步都保存到当前位置最大数 
            dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];
        } 
    } 
         
    int ans = 0;
    for(int j=1;j<=n;j++){
        //最后一行,取最大数 
        ans = max(ans,dp[n][j]);
    } 
    cout<<ans<<endl;
    return 0;
}

 

洛谷 P1002

 https://www.luogu.com.cn/problem/P1002

程序模板:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
int const maxn=10001;
LL dp[21][21]={1};
bool cb[21][21]={false};
int dx[9]={0,-2,-1,1,2,-2,-1,1,2};
int dy[9]={0,1,2,2,1,-1,-2,-2,-1};
int main(){
    int n,m,p,q;
    cin>>n>>m>>p>>q;
    for(int i=0;i<9;i++){//标记合法的马的控制点
        int x=p+dx[i],y=q+dy[i];
        if(x>=0&&x<=n&&y>=0&&y<=m)cb[x][y]=1;
    }
    for(int i=0;i<=n;i++){//卒只能向前向右,所以从0遍历到b点坐标即可
        for(int j=0;j<=m;j++){
            if(i)dp[i][j]+=dp[i-1][j];//过滤第一行点 
            if(j)dp[i][j]+=dp[i][j-1];//过滤第一列点 
            if(cb[i][j])dp[i][j]=0;//马的控制点应该是走不到的
        }
    }
    cout<<dp[n][m]<<endl;
    return 0;
}

 

洛谷 P1057

 https://www.luogu.com.cn/problem/P1057

 

问题分析:

3个人3次后的情况

 

 5个人6次后的情况

 

 

 

程序模板:

#include<bits/stdc++.h>
using namespace std;
//i 传球次数  j 第几个人 
int dp[31][31],i,j,m,n;
int main()
{
    cin>>n>>m;
    dp[0][1]=1;// 0次传球 1号拿球,1种方法 
    for(int i=1; i<=m; i++){//i次传球 
        for(int j=1; j<=n; j++){//i次传球时 记录传递到每个人的方法数 
            if(j==1)// 2号和n号传给1号 
                dp[i][j]=dp[i-1][n]+dp[i-1][2];
            else if(j==n)
                dp[i][j]=dp[i-1][1]+dp[i-1][n-1];
            else
                dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
        } 
    } 
        
    cout<<dp[m][1]<<endl;//m次 传到第1号的方法数 
    return 0;
}

 

 

洛谷 P5739

 https://www.luogu.com.cn/problem/P5739

程序模板:

#include<bits/stdc++.h>
using namespace std;

int n;
long long ans=1;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		ans*=i;//n=(n-1)!*n
	}
	cout<<ans;
} 

  

posted @ 2021-03-14 09:49  new-code  阅读(42)  评论(0)    收藏  举报