2018ICPC徐州網路賽 B.BE, GE or NE 記憶化搜尋
阿新 • • 發佈:2018-12-09
#include<bits/stdc++.h> #define inf 0x3f3f3f3f #define ms(x) memset(x,0,sizeof(x)) #define mf(x) memset(x,inf,sizeof(x)) using namespace std; const int N = 1041; const int M = 205; int n, m, k, l; int dp[N][M]; struct node{ int a, b, c; }q[N]; int dfs(int now, int tpans){ if(now>=n) return tpans-100; if(dp[now][tpans]!=inf) return dp[now][tpans]; int ans = tpans-100; if(now%2==0){ int tmp = -100; if(q[now].a > 0){ int _ans = min(100, ans + q[now].a); tmp = max(dfs(now+1, _ans+100), tmp); } if(q[now].b > 0){ int _ans = max(-100, ans - q[now].b); tmp = max(dfs(now+1, _ans+100), tmp); } if(q[now].c > 0){ tmp = max(tmp, dfs(now+1, -ans + 100)); } dp[now][tpans] = tmp; return tmp; } else{ int tmp = 100; if(q[now].a > 0){ int _ans = min(100, ans + q[now].a); tmp = min(dfs(now+1, _ans+100), tmp); } if(q[now].b > 0){ int _ans = max(-100, ans - q[now].b); tmp = min(dfs(now+1, _ans+100), tmp); } if(q[now].c > 0){ tmp = min(tmp, dfs(now+1, -ans + 100)); } dp[now][tpans] = tmp; return tmp; } } int main() { while(scanf("%d%d%d%d",&n,&m,&k,&l)!=EOF) { mf(dp); for(int i=0;i<n;i++){ scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].c); } int ans = dfs(0, m+100); //cout<<ans<<endl; if(ans >= k){ puts("Good Ending"); } else if(ans <= l ){ puts("Bad Ending"); } else puts("Normal Ending"); } return 0; }