问题标题: 酷町堂:3134

0
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
我要回答