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

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

using namespace std;

int field[21][21];
int dp[2][1 << 20];
int h, w;
//
// int dfs(int a,int s){
//	if(a==h*w)return 0;
//	if(dp[a][s]!=-1)return dp[a][s];
//	int res=0;
//	int curh=a/w;
//	int curw=a%w;
//	// ツ置ツつゥツづ按つ「
//	{
//		int ns=s;
//		ns&=~(1<<curw);
//		res=max(res,dfs(a+1,ns));
//	}
//	// ツ置ツつッツづゥツづ按づァツ置ツつュ
//	if((curw==0||!((s>>(curw-1))&1))&&(curh==0||!((s>>(curw))&1))){
//		int ns=s;
//		ns|=(1<<curw);
//		res=max(res,dfs(a+1,ns)+field[curh][curw]);
//	}
//	return dp[a][s]=res;
//}

int main() {

  int t;
  cin >> t;
  int cnt = 0;
  while (cnt < t) {
    cnt++;
    cin >> w >> h;
    for (int i = 0; i < h; i++)
      for (int j = 0; j < w; j++)
        cin >> field[i][j];
    if (w > h) {
      int tf[21][21];
      for (int i = 0; i < h; i++)
        for (int j = 0; j < w; j++)
          tf[w - 1 - j][i] = field[i][j];
      swap(h, w);
      for (int i = 0; i < h; i++)
        for (int j = 0; j < w; j++)
          field[i][j] = tf[i][j];
    }
    memset(dp, 0, sizeof(dp));
    for (int i = h * w - 1; i >= 0; i--) {
      for (int j = 0; j < (1 << w); j++) {
        int s = j;
        int nxt = i % 2;
        int cur = (i + 1) % 2;
        int curh = i / w;
        int curw = i % w;
        dp[nxt][s] = 0;
        // ツ置ツつゥツづ按つ「
        {
          int ns = s;
          ns &= ~(1 << curw);
          dp[nxt][s] = max(dp[nxt][s], dp[cur][ns]);
        }
        // ツ置ツつッツづゥツづ按づァツ置ツつュ
        if ((curw == 0 || !((s >> (curw - 1)) & 1)) &&
            (curh == 0 || !((s >> (curw)) & 1))) {
          int ns = s;
          ns |= (1 << curw);
          dp[nxt][s] = max(dp[nxt][s], dp[cur][ns] + field[curh][curw]);
        }
      }
    }
    int res = dp[0][0];
    cout << "Case " << cnt << ": " << res << endl;
  }

  return 0;
}

Error: TLE

Fixed submission:

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

using namespace std;

int field[21][21];
int dp[2][1 << 20];
int h, w;
//
// int dfs(int a,int s){
//	if(a==h*w)return 0;
//	if(dp[a][s]!=-1)return dp[a][s];
//	int res=0;
//	int curh=a/w;
//	int curw=a%w;
//	// ツ置ツつゥツづ按つ「
//	{
//		int ns=s;
//		ns&=~(1<<curw);
//		res=max(res,dfs(a+1,ns));
//	}
//	// ツ置ツつッツづゥツづ按づァツ置ツつュ
//	if((curw==0||!((s>>(curw-1))&1))&&(curh==0||!((s>>(curw))&1))){
//		int ns=s;
//		ns|=(1<<curw);
//		res=max(res,dfs(a+1,ns)+field[curh][curw]);
//	}
//	return dp[a][s]=res;
//}

int main() {

  int t;
  cin >> t;
  int cnt = 0;
  while (cnt < t) {
    cnt++;
    cin >> w >> h;
    for (int i = 0; i < h; i++)
      for (int j = 0; j < w; j++)
        cin >> field[i][j];
    memset(dp, 0, sizeof(dp));
    for (int i = h * w - 1; i >= 0; i--) {
      for (int j = 0; j < (1 << w); j++) {
        int s = j;
        int nxt = i % 2;
        int cur = (i + 1) % 2;
        int curh = i / w;
        int curw = i % w;
        dp[nxt][s] = 0;
        // ツ置ツつゥツづ按つ「
        {
          int ns = s;
          ns &= ~(1 << curw);
          dp[nxt][s] = max(dp[nxt][s], dp[cur][ns]);
        }
        // ツ置ツつッツづゥツづ按づァツ置ツつュ
        if ((curw == 0 || !((s >> (curw - 1)) & 1)) &&
            (curh == 0 || !((s >> (curw)) & 1))) {
          int ns = s;
          ns |= (1 << curw);
          dp[nxt][s] = max(dp[nxt][s], dp[cur][ns] + field[curh][curw]);
        }
      }
    }
    int res = dp[0][0];
    cout << "Case " << cnt << ": " << res << endl;
  }

  return 0;
}