0
已解决
陈传立
中级守护
中级守护
题目链接: 酷町堂:3134
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<sstream>
#include<string>
#include<list>
using namespace std;
int n,a,b,c[10000001],d,t,f[10000011],mi=0x3f3f3f3f;
int main(){
cin>>n>>a>>b>>d;
for(int i=1;i<=d;i++){
cin>>t;
c[t]=1;
}
f[0]=0;
for(int i=1;i<=n+b;i++){
if(c[i]==0){
int ans=0x3f3f3f3f;
for(int j=max(0,i-b);j<=i-a;j++){
ans=min(ans,f[j]);
}
f[i]=ans;
}else{
int ans=0x3f3f3f3f;
for(int j=max(0,i-b);j<=i-a;j++){
ans=min(ans,f[j]);
}
f[i]=ans+1;
}
}
for(int i=n;i<=n+b;i++){
mi=min(mi,f[i]);
}
cout<<mi;
return 0;
}
0
已采纳
王梓轩
资深光能
资深光能
这题不要被吓到,其实只是一道递推,当然也是最简单的DP
正常的题目应该是:
n级台阶,每次可走a~b级,有多少种走法?
这时就是简单的递推,课上应该教模板了。
之后我们在输入时标记有青苔的台阶下标在f数组中的值为-1,在递推时加上特殊判断
如果(f[i]的值为-1)将f[i]的值修改为0
这样最后输出f[n]即可。
0
0
0
0
0
0