洛谷 #1541. 烏龜棋

題意

n個格子中有一些分數,到達一個格子就可以拿到。初始在1,n爲終點

有m張牌,保證用完剛好到達終點。牌有向前移動1,2,3,4格四種,求最高分數

題解

dp[j1][j2][j3][j4]表示用j1張‘1’牌,j2張‘2’牌,j3張‘3’牌,j4張‘4’牌能達到的最高分數

調試記錄

判斷j1 != 0要用if (j1),不是if (!j1)

#include <cstdio>
#include <cstring> 
#include <algorithm>

using namespace std;

int dp[41][41][41][41], n, m, a[355], b[5];

int main(){
	memset(b, 0, sizeof b);
	scanf("%d%d", &n, &m);
	
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (int t, i = 1; i <= m; i++){
		scanf("%d", &t); b[t]++;
	}
	
	memset(dp, 0, sizeof(dp));
	dp[0][0][0][0] = a[1];
	
	for (int j1 = 0; j1 <= b[1]; j1++){
		for (int j2 = 0; j2 <= b[2]; j2++){
			for (int j3 = 0; j3 <= b[3]; j3++){
				for (int j4 = 0; j4 <= b[4]; j4++){
					int tmp = 1 + j1 + j2 * 2 + j3 * 3 + j4 * 4;
					if (j1) dp[j1][j2][j3][j4] = max(dp[j1][j2][j3][j4], dp[j1 - 1][j2][j3][j4] + a[tmp]);
					if (j2) dp[j1][j2][j3][j4] = max(dp[j1][j2][j3][j4], dp[j1][j2 - 1][j3][j4] + a[tmp]);
					if (j3) dp[j1][j2][j3][j4] = max(dp[j1][j2][j3][j4], dp[j1][j2][j3 - 1][j4] + a[tmp]);
					if (j4) dp[j1][j2][j3][j4] = max(dp[j1][j2][j3][j4], dp[j1][j2][j3][j4 - 1] + a[tmp]);
				}
			}
		}
	}
	
	printf("%d\n", dp[b[1]][b[2]][b[3]][b[4]]);
	
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章