袋鼠过河
时间限制: 1 Sec 内存限制: 128 MB提交: 33 解决: 11
题目描述
输入
输出
样例输入
5
2 0 1 1 1
样例输出
4
解题思路:袋鼠每次可以*跳<=此时弹簧的弹力系数的距离*。如果f[i]表示跳i距离下跳的最小次数。则f[j]=a[i]+1;
源代码:
#include<cstdio>
#include<cstring>
const int M=100050;
int dp[M];
int v[M];
int a[M];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dp[1]=0;v[1]=1;
for(int i=2;i<=1+a[1];i++)
{
dp[i]=1;
v[i]=1;
}
for(int i=2;i<=n;i++)
{
if(a[i]==0)continue;
for(int j=i+1;j<=a[i]+i;j++)
{
if(v[i]&&!v[j])
{
dp[j]=dp[i]+1;
v[j]=1;
}
}
}
if(v[n+1]) printf("%d\n",dp[n+1]);
else printf("-1\n");
}
return 0;
}
开始用的dfs做的,但是超时了。。。只过了86%的数据。
源代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int ans=0;
int a[10500];
int vis[10500];
void dfs(int t)
{
if(t==n+1)
{
ans++;
return;
}
if(a[t]==0)
return ;
vis[t]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=a[i];j++)
{
if(vis[t+j]==1)
continue;
dfs(t+j);
}
}
return ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(vis,0,sizeof(vis));
ans=-1;
vis[1]=1;
dfs(1);
if(ans!=-1)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}