• hdu 4784 Dinner Coming Soon dp


    不算很难的一个dp,一个错误的认识是只有DAG才能dp,当然只有DAG才能dp,但是这里的图有环,它却是DAG,因为有了其它维度(比如时间),那么不同时间的同一个点其实是两个不同的点。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=1e9+10;
    
    int N,M,B,K,R,T;
    int p[12][120];/// p[k][i],kth层第i个点
    int u,v,t,m;
    struct Edge
    {
        int v,t,m;
    };
    vector<Edge> G[maxn];
    int dp[120][12][210][6][3];/// dp[i][k][t][b][op] , 0 nothing,1 sell,2 buy
    bool vis[120][12][210][6][3];
    
    void Input()
    {
        REP(i,1,N) G[i].clear();
        REP(k,0,K-1){
            REP(i,1,N){
                scanf("%d",&p[k][i]);
            }
        }
        REP(i,1,M){
            scanf("%d%d%d%d",&u,&v,&t,&m);
            G[u].push_back({v,t,m});
        }
    }
    
    int dfs(int u,int k,int t,int b,int op)
    {
        if(t<0||b>B||b<0) return -INF;
        int &res=dp[u][k][t][b][op];
        if(vis[u][k][t][b][op]) return res;
        vis[u][k][t][b][op]=1;
        if(u==1||u==N) if(k||op) return res=-INF;
        if(u==N) return res=0;
        res=-INF;
        int tmp;
        /// 到这一层的其它点
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i].v,wt=G[u][i].t,wn=G[u][i].m;
            tmp=dfs(v,k,t-wt,b,0)-wn;
            if(tmp>=-R) res=max(res,tmp);
            tmp=dfs(v,k,t-wt,b-1,1)-wn+p[k][v];
            if(tmp>=-R) res=max(res,tmp);
            tmp=dfs(v,k,t-wt,b+1,2)-wn-p[k][v];
            if(tmp>=-R) res=max(res,tmp);
        }
        /// 到下一层
        int nk=(k+1)%K;
        //cout<<"u="<<u<<" k="<<k<<" nk="<<nk<<endl;
        tmp=dfs(u,nk,t-1,b,0);
        if(tmp>=-R) res=max(res,tmp);
        tmp=dfs(u,nk,t-1,b-1,1)+p[nk][u];
        if(tmp>=-R) res=max(res,tmp);
        tmp=dfs(u,nk,t-1,b+1,2)-p[nk][u];
        if(tmp>=-R) res=max(res,tmp);
        return res;
    }
    
    int main()
    {
        #ifndef ONLINE_JUDGE
            freopen("in.txt","r",stdin);
        #endif // ONLINE_JUDGE
        int cas;cin>>cas;int casen=1;
        while(cas--){
            scanf("%d%d%d%d%d%d",&N,&M,&B,&K,&R,&T);
            Input();
            MS0(vis);MS0(dp);
            printf("Case #%d: ",casen++);
            //cout<<"T="<<T<<" B="<<B<<endl;
            //cout<<"=="<<dfs(2,0,T,0,0)<<endl;
            //cout<<"==="<<dfs(2,1,T,B,1)<<endl;
            int ans=R+dfs(1,0,T,0,0);
            //cout<<"R="<<R<<endl;
            //cout<<R<<" "<<dfs(1,0,T,B,0)<<endl;
            if(ans<0) puts("Forever Alone");
            else printf("%d
    ",ans);
        }
        return 0;
    }
    /**
    2
    3 2 1 2 10 6
    -1 1 -1
    -1 5 -1
    1 2 1 0
    2 3 1 1
    2 2 1 2 5 5
    -1 -1
    -1 -1
    1 2 10 2
    1 2 2 10
    */
    View Code

    第一次提交WA的时候我以为我会调试很久,没想到检查了一遍之后很快发现了有一个字符打错,改了一下,在测了一下其它数据,再把思路从头到尾理一下,顺便再检查一下代码,提交,出现了令人兴奋的Accepted!之前老是出现满屏的WA,这次这么快就出现Accept,很久没有令人兴奋的这种感觉了。改变了做题习惯后,我的状态慢慢找回来了。下一场codeforces我要涨分!

    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    Call KernelIoControl in user space in WINCE6.0
    HOW TO:手工删除OCS在AD中的池和其他属性
    关于新版Windows Server 2003 Administration Tools Pack
    关于SQL2008更新一则
    微软发布3款SQL INJECTION攻击检测工具
    HyperV RTM!
    OCS 2007 聊天记录查看工具 OCSMessage
    CoreConfigurator 图形化的 Server Core 配置管理工具
    OC 2007 ADM 管理模板和Live Meeting 2007 ADM 管理模板发布
    Office Communications Server 2007 R2 即将发布
  • 原文地址:https://www.cnblogs.com/--560/p/5259388.html
Copyright © 2020-2023  润新知