阅读背景:

hdu 4784 Dinner Coming Soon dp

来源:互联网 

dp[T][N][K][B]



#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;
#define ll long long
#pragma comment(linker,"/STACK:102400000,102400000")
#define FOR( i, a, b ) for(int i = a; i <= b; ++i )
const int ma=1e+9;
const int fa=1e+3+112;
int n,m,b,k,r,t,T;
int dp[333][333][7][7];
int dp1[7];
int w[333][7];
int x,y,ww;
struct wgh
{
    int v,w,t;
    int ne;
} ed[fa];
int tot=0,head[fa],tt;
void adde(int x,int y,int t,int w)
{
    tot++;
    ed[tot].ne=head[x];
    ed[tot].v=y;
    ed[tot].t=t;
    ed[tot].w=w;
    head[x]=tot;
}
int main()
{
#ifndef ONLINE_JUDGE
    //freopen("out.txt","w",stdout);
    //freopen("in.txt","r",stdin);
#endif
    int i,j;
    scanf("%d",&T);
    for(int iii=1; iii<=T; iii++)
    {
        scanf("%d%d%d%d%d%d",&n,&m,&b,&k,&r,&t);
//        for(i=0; i<=t; i++)
//            for(j=0; j<=n; j++)
//                for(int ii=0; ii<k; ii++)
//                    for(int jj=0; jj<=b; jj++)
//                    {
//                        dp[i][j][ii][jj]=-ma;
//                    }
        memset(dp,-1,sizeof(dp));
        dp[0][1][0][0]=r;
        for(i=0; i<k; i++)
            for(j=1; j<=n; j++)
                scanf("%d",&w[j][i]);
        tot=0;
        memset(head,-1,sizeof(head));
        for(i=1; i<=m; i++)
        {
            scanf("%d%d%d%d",&x,&y,&tt,&ww);
            if(x==n)continue;
            adde(x,y,tt,ww);
        }
        for(i=0; i<t; i++)
            for(j=1; j<=n; j++)
                for(int ii=0; ii<k; ii++)
                {
                    memset(dp1,-1,sizeof(dp1));
                    for(int jj1=0; jj1<=b; jj1++)
                        for(int jj2=0; jj2<=b; jj2++)
                            if(dp[i][j][ii][jj2]>=0)
                            {
                                if(w[j][ii]>=0&&(dp[i][j][ii][jj2]-w[j][ii]*(jj1-jj2)>=0))
                                    if(abs(jj1-jj2)<=1)
                                    {
//                                        if(i==2&&j==2&&ii==1&&jj1==1)
//                                        {
//                                            cout<<dp[i][j][ii][jj1]<<endl;
//                                        }
                                        dp1[jj1]=max(dp1[jj1],dp[i][j][ii][jj2]-w[j][ii]*(jj1-jj2));
//                                        if(i==1&&j==2&&ii==0&&jj1==1)
//                                        {
//                                            cout<<dp1[jj1]<<endl;
//                                        }
                                    }
                            }

                    for(int jj1=0; jj1<=b; jj1++)
                        if(dp1[jj1]>=0&&j!=n)
                            dp[i][j][ii][jj1]=dp1[jj1];
                    for(int jj=0; jj<=b; jj++)
                        if(dp[i][j][ii][jj]>=0)
                        {
//                            if(i==3&&j==2&&ii==1&&jj==2)
//                            {
//                                cout<<dp[i][j][ii][jj]<<endl;
//                            }
                            if(j==1||j==n)
                                if(ii!=0)continue;
                            //if(j==1&&jj!=0)continue;
                            if(j==n)
                            dp[i+1][j][ii][jj]=max(dp[i][j][ii][jj],dp[i+1][j][ii][jj]);
                            dp[i+1][j][(ii+1+k)%k][jj]=max(dp[i+1][j][(ii+1+k)%k][jj],dp[i][j][ii][jj]);
                            //dp[i+1][j][(ii-1+k)%k][jj]=max(dp[i+1][j][(ii-1+k)%k][jj],dp[i][j][ii][jj]);
                            for(int v=head[j]; j!=n&&(~v); v=ed[v].ne)
                            {
                                int y=ed[v].v;
                                int ww=ed[v].w;
                                int tt=ed[v].t;
                                //if(y==1)continue;
                                if(dp[i][j][ii][jj]-ww>=0)
                                {
                                    if(y==1||y==n)
                                        if(ii!=0)continue;
                                    dp[i+tt][y][ii][jj]=max(dp[i][j][ii][jj]-ww,dp[i+tt][y][ii][jj]);
                                }
                            }

                        }
                }
        int ans=-ma;
        for(i=0; i<=b; i++)
            ans=max(ans,dp[t][n][0][i]);
        if(ans>=0)
            printf("Case #%d: %d\n",iii,ans);
        else
            printf("Case #%d: Forever Alone\n",iii);

    }
    return 0;
}
#include <cstdlib>
#i



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: