动态规划-基础练习
洛谷 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;
}
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号