Problem p01361 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cstring>
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;
int dy[201];
int dx[201];
ll dp[1010][1 << 12];
char field[101][101];
int dmg[201];
int stepDmg[2001];
int portions[101];
int inithp;
int maxhp;
int r, c;
int step;
int S, P, T;

const ll INF = 100000000000000LL;

//// S[©çßÄX^[gÖü©¤
// ll dfs(int pos,int s){
//	if(pos==-1){
//		ll sum=0;
//		//
//Ü¾gpµÄ¢È¢àÌð·×Äg¤ 		for(int
//i=0;i<P;i++)if(!((s>>i)&1))sum+=portions[i]; 		return min(maxhp*1LL,sum+inithp);
//	}
//	else if(dp[pos][s]!=-1)return dp[pos][s];
//	ll res=-INF;
//	// Ü¾gpµÄ¢È¢portionðgp
//	for(int k=0;k<P;k++)
//		if(!((s>>k)&1))if(dfs(pos,s|(1<<k))>0)res=max(res,min(dfs(pos,s|(1<<k))+portions[k],maxhp*1LL));
//	// ÌêÖ
//	res=max(res,dfs(pos-1,s)-stepDmg[pos]);
//	if(res<0)res=-INF;
//	return dp[pos][s]=res;
// }

void input() {
  cin >> r >> c;
  for (int i = 0; i < r; i++)
    for (int j = 0; j < c; j++)
      cin >> field[i][j];
  cin >> T;
  for (int i = 0; i < T; i++) {
    char ch;
    int m;
    cin >> ch >> m;
    dmg[ch] = m;
  }
  cin >> S;
  int cx = 0;
  int cy = 0;
  for (int i = 0; i < S; i++) {
    char ch;
    int quan;
    cin >> ch >> quan;
    for (int j = 0; j < quan; j++) {
      int ny = cy + dy[ch];
      int nx = cx + dx[ch];
      stepDmg[step] = dmg[field[ny][nx]];
      step++;
      cx = nx;
      cy = ny;
    }
  }
  cin >> P;
  for (int i = 0; i < P; i++)
    cin >> portions[i];
}

int main() {
  dy['U'] = -1;
  dx['U'] = 0;
  dy['R'] = 0;
  dx['R'] = 1;
  dy['D'] = 1;
  dx['D'] = 0;
  dy['L'] = 0;
  dx['L'] = -1;
  while (cin >> inithp >> maxhp && (inithp | maxhp)) {
    step = 0;
    input();
    // memset(dp,-1,sizeof(dp));
    // for(int i=0;i<1010;i++)for(int j=0;j<(1<<12);j++)dp[i][j]=-1;
    // if(dfs(step-1,0)>0)cout<<"YES"<<endl;
    // else cout<<"NO"<<endl;
    //  startn_ÅÍ,cÁ½¨ð·×Äg¤
    for (int j = 0; j < (1 << P); j++) {
      ll sum = 0;
      for (int i = 0; i < P; i++)
        if (!((j >> i) & 1))
          sum += portions[i];
      dp[0][j] = min(1LL * maxhp, sum + inithp);
    }
    for (int i = 0; i < step; i++) {
      for (int j = (1 << P) - 1; j >= 0; j--) {
        ll res = -INF;
        int s = j;
        int pos = i;
        // Ü¾gpµÄ¢È¢portionðgp
        for (int k = 0; k < P; k++)
          if (!((s >> k) & 1) && dp[pos + 1][s | (1 << k)] > 0) {
            res = max(
                res, min(dp[pos + 1][s | (1 << k)] + portions[k], maxhp * 1LL));
          }
        // ÌêÖ
        res = max(res * 1LL, dp[pos][s] - stepDmg[pos]);
        if (res < 0)
          res = -INF;
        dp[pos + 1][s] = min(maxhp * 1LL, res);
      }
    }
    bool ok = false;
    for (int j = 0; j < (1 << P); j++)
      if (dp[step][j] > 0)
        ok = true;
    if (ok)
      cout << "YES" << endl;
    else
      cout << "NO" << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>

using namespace std;

int dy[201];
int dx[201];
int dp[1010][1 << 12];
char field[101][101];
int dmg[201];
int stepDmg[2001];
int portions[101];
int inithp;
int maxhp;
int r, c;
int step;
int S, P, T;

const int INF = 1000000000;

// S[©çßÄX^[gÖü©¤
int dfs(int pos, int s) {
  if (pos == -1) {
    int sum = 0;
    // Ü¾gpµÄ¢È¢àÌð·×Äg¤
    for (int i = 0; i < P; i++)
      if (!((s >> i) & 1))
        sum += portions[i];
    return sum + inithp;
  } else if (dp[pos][s] != -1)
    return dp[pos][s];
  int res = -INF;
  // Ü¾gpµÄ¢È¢portionðgp
  for (int k = 0; k < P; k++)
    if (!((s >> k) & 1))
      res = max(res, min(dfs(pos, s | (1 << k)) + portions[k], maxhp));
  // ÌêÖ
  res = max(res, dfs(pos - 1, s) - stepDmg[pos]);
  if (res < 0)
    res = -INF;
  return dp[pos][s] = res;
}

int main() {
  dy['U'] = -1;
  dx['U'] = 0;
  dy['R'] = 0;
  dx['R'] = 1;
  dy['D'] = 1;
  dx['D'] = 0;
  dy['L'] = 0;
  dx['L'] = -1;

  while (cin >> inithp >> maxhp && (inithp | maxhp)) {
    step = 0;
    cin >> r >> c;
    for (int i = 0; i < r; i++)
      for (int j = 0; j < c; j++)
        cin >> field[i][j];
    cin >> T;
    for (int i = 0; i < T; i++) {
      char ch;
      int m;
      cin >> ch >> m;
      dmg[ch] = m;
    }
    cin >> S;
    int cx = 0;
    int cy = 0;
    for (int i = 0; i < S; i++) {
      char ch;
      int quan;
      cin >> ch >> quan;
      for (int j = 0; j < quan; j++) {
        int ny = cy + dy[ch];
        int nx = cx + dx[ch];
        stepDmg[step] = dmg[field[ny][nx]];
        step++;
        cx = nx;
        cy = ny;
      }
    }
    cin >> P;
    for (int i = 0; i < P; i++)
      cin >> portions[i];
    memset(dp, -1, sizeof(dp));
    if (dfs(step - 1, 0) > 0)
      cout << "YES" << endl;
    else
      cout << "NO" << endl;
  }

  return 0;
}

// #include <cstdio>
// #include <iostream>
// #include <vector>
// #include <list>
// #include <cmath>
// #include <fstream>
// #include <algorithm>
// #include <string>
// #include <queue>
// #include <set>
// #include <map>
// #include <complex>
// #include <iterator>
// #include <cstdlib>
// #include <cstring>
// #include <sstream>
// using namespace std;
//
// int R,C;
// int S;
// int T;
// int P;
// int hpInit;
// int hpMax;
// char dmg[101][101];
// int tbl[101];
// pair<char,int> seq[1010];
// int portion[101];
// int combPortionEf[1<<12];
// pair<int,int> points[1010];
// int dp[2][1<<12];
// int dy[101];
// int dx[101];
//
// const int INF=1000000000;
//
// int main(){
//
//	dy['U']=-1;
//	dx['U']=0;
//	dy['R']=0;
//	dx['R']=1;
//	dy['D']=1;
//	dx['D']=0;
//	dy['L']=0;
//	dx['L']=-1;
//
//	while(cin>>hpInit>>hpMax&&(hpInit|hpMax)){
//		memset(dp,0,sizeof(dp));
//		memset(portion,0,sizeof(portion));
//		memset(combPortionEf,0,sizeof(combPortionEf));
//		memset(tbl,0,sizeof(tbl));
//		memset(dmg,0,sizeof(dmg));
//
//		cin>>R>>C;
//		for(int i=0;i<R;i++)for(int j=0;j<C;j++)cin>>dmg[i][j];
//		cin>>T;
//		for(int i=0;i<T;i++){
//			char ch;
//			int quan;
//			cin>>ch>>quan;
//			tbl[ch]=quan;
//		}
//		cin>>S;
//		for(int i=0;i<S;i++){
//			int a;char b;
//			cin>>b>>a;
//			seq[i]=make_pair(b,a);
//		}
//		cin>>P;
//		for(int i=0;i<P;i++)cin>>portion[i];
//		for(int i=0;i<(1<<P);i++){
//			int sum=0;
//			for(int j=0;j<P;j++)if(!((i>>j)&1))sum+=portion[j];
//			combPortionEf[i]=sum;
//		}
//		int cx,cy;
//		cx=cy=0;
//		points[0].first=points[0].second=0;
//		int idx=1;
//		for(int i=0;i<S;i++){
//			// seq[pos].secondñ®©·
//			for(int j=0;j<seq[i].second;j++){
//				int nx=cx+dx[seq[i].first];
//				int ny=cy+dy[seq[i].first];
//				cy=ny,cx=nx;
//				points[idx].first=cy;
//				points[idx].second=cx;
//				idx++;
//			}
//		}
//		for(int j=0;j<(1<<P);j++)
//			dp[0][j]=min(hpMax,combPortionEf[j]+hpInit);
//		bool ok=false;
//		if(idx==1)for(int j=0;j<(1<<P);j++)if(dp[0][j]>0)ok=true;
//		//
//iÔÚÜÅÝÄjÌportionªcÁÄ¢éÌÅåcèCtðßé
//		for(int i=1;i<idx;i++){
//			for(int j=(1<<P)-1;j>=0;j--){
//				int cur=(i-1)%2;
//				int nxt=(i)%2;
//				dp[nxt][j]=-INF;
//				for(int k=0;k<P;k++){
//					if(!((j>>k)&1))
//						dp[nxt][j]=max(dp[nxt][j],min(hpMax,dp[nxt][j|(1<<k)]+portion[k]));
//				}
//				int ny=points[i].first;
//				int nx=points[i].second;
//				dp[nxt][j]=max(dp[nxt][j],dp[cur][j]-tbl[dmg[ny][nx]]);
//				// 0ÈºÈçABsÂ\\
//				if(dp[nxt][j]<=0)dp[nxt][j]=-INF;
//				if(i==idx-1&&dp[nxt][j]>0)ok=true;
//			}
//		}
//		//
//S[BÉAÅåCtª0æèå«¯êÎok
//		if(ok)cout<<"YES"<<endl;
//		else cout<<"NO"<<endl;
//	}
//	return 0;
// }