























走楼梯(低精度)
#include<iostream>
using namespace std;
int dp[200000];
int main()
{
int n;
cin>>n;
dp[1]=1;dp[2]=2;
for(int i=3;i<=n;i++)
{
dp[i]=dp[i-1]+dp[i-2];
}
cout<<dp[n]<<endl;
return 0;
}
走楼梯(高精度)
#include<bits/stdc++.h>
using namespace std;
int n,len=1,dp[6000][6000];
void DP(int n){
for(int i=1;i<=len;i++)
dp[n][i]=dp[n-1][i]+dp[n-2][i];
for(int i=1;i<=len;i++){
if(dp[n][i]>=10){
dp[n][i+1]+=dp[n][i]/10;
dp[n][i]%=10;
if(dp[n][len+1])
len++;
}
}
}
int main(){
cin>>n;
dp[0][1]=1;
dp[1][1]=1;
for(int i=2;i<=n;i++)
DP(i);
for(int i=len;i>=1;i--)
cout<<dp[n][i];
return 0;
}
最优走楼梯1
#include<bits/stdc++.h>
using namespace std;
int v[10000];
int dp[10000];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
dp[0]=0;dp[1]=v[1];
for(int i=2;i<=n;i++)
{
dp[i]=max(dp[i-1],dp[i-2])+v[i];
}
cout<<dp[n];
return 0;
}
最优走楼梯2
#include<bits/stdc++.h>
using namespace std;
long long dp[1005],v[1005];
int fmax(int x,int y)//x和y分别表示i和p
{
int i;
long long ans=-2e9;//一定要初始化!
for(i=max(0,x-y);i<x;i++)//注意是i<x
ans=max(ans,dp[i]);
return ans;
}
int main()
{
int n,i,p;
cin>>n>>p;
for(i=1;i<=n;i++)
cin>>v[i];
for(i=1;i<=n;i++)//这里要注意:不用初始化第一个
dp[i]=fmax(i,p)+v[i];
cout<<dp[n];
return 0;
}

2216

被折叠的 条评论
为什么被折叠?



