No.1 硬币
#include<bits/stdc++.h>
using namespace std;
#define MAX 0x3f3f3f3f
int main(){
int A[]={2,5,7} ,M;
cin>>M;
int n=3;
int f[M+1];//因为要用到f[M]
f[0]=0;//初始化
for(int i=1;i<=M;i++){
f[i]=MAX;//全部初始化
for(int j=0;j<n;j++){
if(i-A[j]>=0&&i-A[j]!=MAX){//判断
f[i]=min(f[i-A[j]]+1,f[i]);
}
}
}
if(f[M]==MAX) cout<<"-1"<<endl;
else cout<<f[M]<<endl;
return 0;
}
No.2机器人走到右下角
- 求计数型动态规划
- 1.确定状态
- 最后一步可以通过前一步(上或者左)相加
- 2.转化方程
- f[i][j]=f[i-1][j]+f[i][j-1]
- 3.初始条件及边界情况
- f[0][0]=1;
- i=0或者j=0时,f[i][j]=1;
- 4.计算顺序
- 二维题目:先第一行,,再第二,三行
#include<bits/stdc++.h>
using namespace std;
#define MAX 0x3f3f3f3f
int main(){
int m,n;
cin>>m>>n;
int f[110][110];//f[i][j]指机器人有多少种方式到右下角
for(int i=0;i<m;i++){//行
for(int j=0;j<n;j++){//列
if(i==0||j==0){
f[i][j]=1;
}
else{
f[i][j]=f[i-1][j]+f[i][j-1];
}
}
}
cout<<f[m-1][n-1]<<endl;
return 0;
}
No.3小青蛙跳到最后一块石头上
**存在型动态规划
-
最后一步:跳到n-1
/前一步:跳到j,而且n-1-j<=a[j],所以转化为能不能跳到j -
转化方程:
- 初始条件:f[0]=1;
- 所求是f[n-1]
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n],f[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
f[0]=1;
for(int j=1;j<n;j++){
f[j]=0;
for(int i=0;i<j;i++){
if(f[i]&&j-i<=a[i]){
f[j]=1;
break;
}
}
}
cout<<f[n-1]<<endl;
return 0;
}
~~未完待续,马上回来~
~~我回来啦~
No.4 最长上升子序列
- 1.确定状态:
- 2.转移方程:f[i]=max( f[i], f[j]+1 )
- 3.初始条件:f[i]=1
- 4.计算顺序:f[0]----->f[n-1]
#include<bits/stdc++.h>
using namespace std;
int a[100];
int f[100];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
//重点
for(int i=0;i<n;i++){
f[i]=1;
for(int j=0;j<i;j++){
if(a[i]>a[j]){
f[i]=max(f[i],f[j]+1);
}
}
}
//找出最大的上升序列
int maxx=f[0];
for(int i=1;i<n;i++){
if(f[i]>f[i-1]) maxx=f[i];
}
cout<<maxx<<endl;
return 0;
}
No.5最大连续乘积
emmmm开始的时候混了,要是最大乘积的话只要筛选一下负数有多少个不就了,所以肯定要考察连续乘积,和上升序列&连续上升序列不一样的地方。
注意负负得正,需要记下最大和最小值,我发现用max,min好方便哈哈哈,不过注意一次只能比较两个
#include<bits/stdc++.h>
using namespace std;
int a[100];
int ma[100],mi[100];
int main(){
int n,maxval;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
maxval=ma[0]=mi[0]=a[0];//初始化
for(int i=1;i<n;i++){//注意昂,只能同时比较两个大小
ma[i]=max(max(ma[i-1]*a[i],mi[i-1]*a[i]),a[i]);
mi[i]=min(min(ma[i-1]*a[i],mi[i-1]*a[i]),a[i]);
maxval=max(maxval,ma[i]);
}
cout<<maxval<<endl;
return 0;
}