D. Cow Program

http://codeforces.com/contest/284/problem/D

dp+记忆化搜索

代码:

#include<iostream>

#include<cmath>

#include<cstdio>

#include<string>

#include<cstring>

#include<vector>

#include<stack>

#include<queue>

#include<map>

#include<set>

#include<algorithm>



#define LL long long



using namespace std;



const int INF=0x3f3f3f3f;

const int N=200005;

long long inc[N],decr[N];

int had1[N],had2[N];

int a[N];

int n;

long long dpdecr(int x,int k);

long long dpinc(int x,int k)

{//cout<<"inc "<<x<<" "<<k<<endl;

    if(x<=0||x>n)

    return 0;

    if(had1[x]==k)

    return -1;

    if(inc[x]!=-2)

    return inc[x];

    had1[x]=k;

    long long tmp=dpdecr(x+a[x],k);

    if(tmp==-1)

    return (inc[x]=-1);

    return (inc[x]=tmp+a[x]);

}

long long dpdecr(int x,int k)

{//cout<<"decr "<<x<<" "<<k<<endl;

    if(x<=0||x>n)

    return 0;

    if(had2[x]==k)

    return -1;

    if(decr[x]!=-2)

    return decr[x];

    had2[x]=k;

    long long tmp=dpinc(x-a[x],k);

    if(tmp==-1)

    return (decr[x]=-1);

    return (decr[x]=tmp+a[x]);

}

int main()

{

    //freopen("data.in","r",stdin);

    while(cin>>n)

    {

        for(int i=2;i<=n;++i)

        cin>>a[i];

        memset(had1,0,sizeof(had1));

        memset(had2,0,sizeof(had2));

        for(int i=1;i<=n;++i)

        inc[i]=decr[i]=-2;

        inc[1]=-1;

        decr[1]=0;

        for(int i=2;i<=n;++i)

        {

           long long k=dpdecr(i,i);

           if(k==-1)

           cout<<"-1"<<endl;

           else

           cout<<(k+i-1)<<endl;

        }

    }

    return 0;

}

  

你可能感兴趣的:(c)