poj running

//一道usaco月赛题目,,使用记忆化搜索会慢很多,写的不好25000000次准定超时,好点在5000000次,也是超时边缘,这点是一条宝贵的经验

//就题而言可以设定状态f[i][j]表示第i分钟,体力含有j的时候的最远路程,具体的卸载注释中


using namespace std;
const int MAX=10005,INF=1<<30;
int f[MAX][505];
int d[MAX];
int n,m;
int main()
{
#ifndef ONLINE_JUDGE
    freopen("i.txt", "r", stdin);
#endif
    while(cin>>n>>m){
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
            cin>>d[i];

        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                if(j>=1){
                    f[i][j]=f[i-1][j-1]+d[i];
                    //for(int k=1;k<=i&&j+k<=m;k++)
                      //  f[i][j]=max(f[i][j],f[i-k][j+k]);
                    //去掉上面这两行的原因在于,由于题目的限制,即必须
                    //休息到体力值为零的时候才可以继续跑,那么上面两行
                    //会包含在下面体力为零的时候的状态转移中
                }
                else{
                    f[i][j]=f[i-1][j];
                    for(int k=1;k<=i&&j+k<=m;k++)
                        f[i][j]=max(f[i][j],f[i-k][j+k]);
                }
            }
        }
        cout<<f[n][0]<<endl;//根据最终体力必须是零,输出f[][0]即可
    }

    return 0;
}

你可能感兴趣的:(poj running)