mask[5]={0, 3, 6, 12, 15}; int cnt[5] ={0, 1, 1, 1, 2}; int main() { int h, n; cin >> h >> n; fill(obs, obs+10005, 0); for(int i=0; i<n; i++){ int x, y; cin >> x >> y; obs[y]=obs[y] | (1<<x); } obs[h]=15; 問7 C++による解答例 fill(dp[h], dp[h]+16, 0); for(int i=h-1; i>=0; i--){ for(int j=0; j<16; j++){ dp[i][j]=0; for(int k=0; k<5; k++){ if((mask[k]&j)|(mask[k]&obs[i+1])) continue; dp[i][j]=max(dp[i][j], cnt[k]+dp[i+1][obs[i+1]|mask[k]]); } } } cout << dp[0][obs[0]] << endl; }