Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

效果较好的剪枝

Posted by zhangxiao1124 at 2008-05-21 22:53:06 on Problem 2178 and last updated at 2008-05-21 22:54:08
/*
记录一下最大L[i]用来剪枝
*/
#include<iostream>
using namespace std;
#define maxn 12
#define maxhp 105
#define maxmp 55
int n,L,Hp,Mp,Mhp,Mn,v,dh,l[maxn],sol[maxhp][maxmp][maxhp][maxn];
bool rec[maxhp][maxmp][maxhp][maxn],done[maxhp][maxmp][maxhp][maxn];

void Init() {
    scanf("%d%d%d",&n,&Hp,&Mp);
    scanf("%d%d%d",&Mhp,&Mn,&v);
    scanf("%d",&dh);
    L=0;
    for (int i=1; i<=n; i++) {
        scanf("%d",&l[i]);
        L>?=l[i];
    }
}

inline void Monster(int& hp,int& mp,int& mhp,int& pos) {
    if (mhp<=0) return;
    int d=min(v,pos-1);
    pos-=d;
    if (pos==1) {
        int sum=mhp/Mhp;
        if (mhp%Mhp) sum++;
        hp-=sum;
    }
}

inline bool F(int hp,int mp,int mhp,int pos) {
    if (hp<=0) return false;
    if (mhp<=0) return true;
    if (!mp) return false;
    if (mp*L<mhp) return false;//不写这几个字就TLE
    if (done[hp][mp][mhp][pos]) return rec[hp][mp][mhp][pos];
    done[hp][mp][mhp][pos]=true;
    int a,b,c,d;
    a=hp,b=mp,c=mhp,d=pos;
    c-=l[d],b--;
    Monster(a,b,c,d);
    if (F(a,b,c,d)) {
        sol[hp][mp][mhp][pos]=-1;
        rec[hp][mp][mhp][pos]=true;
        return true;
    }
    a=hp,b=mp,c=mhp,d=pos;
    a+=dh,a<?=Hp,b--;
    Monster(a,b,c,d);
    if (F(a,b,c,d)) {
        sol[hp][mp][mhp][pos]=-2;
        rec[hp][mp][mhp][pos]=true;
        return true;
    }
    for (int i=1; i<=n; i++) if (i!=pos) {
        a=hp,b=mp-1,c=mhp,d=i;
        Monster(a,b,c,d);
        if (F(a,b,c,d)) {
            sol[hp][mp][mhp][pos]=i;//这里一开始写成了d 
            rec[hp][mp][mhp][pos]=true;
            return true;
        }
    }
    return false;
}

inline void Print(int hp,int mp,int mhp,int pos) {
    int flag=sol[hp][mp][mhp][pos];
    if (flag==-1) {
        puts("L");
        mhp-=l[pos];
    } else if (flag==-2) {
        puts("H");
        hp+=dh;
        hp<?=Hp;
    } else {
        printf("T %d\n",flag);
        pos=flag;
    }
    mp--;
    if (mhp<=0) return;
    Monster(hp,mp,mhp,pos);
    Print(hp,mp,mhp,pos);
}

int main() {
    Init();
    if (F(Hp,Mp,Mhp*Mn,n)) {
        puts("VICTORIOUS"); 
        Print(Hp,Mp,Mhp*Mn,n);
    }
    else puts("DEFEATED");
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator