小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。
烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數(非負整數)。棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。
烏龜棋中m張爬行卡片,分成4種不同的型別(m張卡片中不一定包含所有4種型別的卡片,見樣例),每種型別的卡片上分別標有1、2、3、4四個數字之一,表示使用這種卡片後,烏龜棋子將向前爬行相應的格仔數。遊戲中,玩家每次需要從所有的爬行卡片中選擇一張之前沒有使用過的爬行卡片,控制烏龜棋子前進相應的格仔數,每張卡片只能使用一次。
遊戲中,烏龜棋子自動獲得起點格仔的分數,並且在後續的爬行中每到達乙個格仔,就得到該格仔相應的分數。玩家最終遊戲得分就是烏龜棋子從起點到終點過程中到過的所有格仔的分數總和。
很明顯,用不同的爬行卡片使用順序會使得最終遊戲的得分不同,小明想要找到一種卡片使用順序使得最終遊戲得分最多。
現在,告訴你棋盤上每個格仔的分數和所有的爬行卡片,你能告訴小明,他最多能得到多少分嗎?
多階段決策尋找最優方案,滿足dp諸多性質,上轉移方程水之。
dp[x][i][j][k][l]表示使用走到x位置同時使用了i張1卡,j張2卡,k張3卡,l張4卡時所能得到的最大分數。題目資料量雖然非常小,使用五維陣列仍會mle。於是對狀態定義進行優化:位置x可以由1234卡使用的張數推出,便減少了一維,空間使用暴減350倍,你值得擁有
/*狀態定義:dp[i][j][k][l]表示使用i張1卡,j張2卡,k張3卡,l張4卡時所能得到的最大分數。
轉移方程:dp[i][j][k][l]=max
其中d=i+j*2+k*3+l*4;且i,j,k,l大於0時進行轉移
邊界:dp[0][0][0][0]=w[0];dp[num_of_1][num_of_2][num_of_3][num_of_4]為最大分值。*/
#include#include#include#define cogs
using namespace std;
int n,m;
int dp[40][40][40][40];
int w[400];
int e[5];
void init(){
int a;
scanf("%d%d",&n,&m);
for(int i=0;i
NOIP2010提高組 烏龜棋
這題一眼dp,本來是設五維的 但是,咳咳,空超了!如何?我們在仔細地看一看dp陣列 我們可以發現,因為,當我們確定了剩下的卡片,我們就能確定了它當前所在的位置是 所以,我們可以直接將i去掉,perfect!那這樣的話,我們只要設四維就可以了。include define max x,y x xusi...
NOIP2010解題報告
t1 機器翻譯 t2 烏龜棋 t3 關押罪犯 t4 引水入城 題解 一套不算太難的noip題目。第一題直接暴力模擬佇列的工作即可。include include include include include include using namespace std intq 10100 int in...
NOIP2010 烏龜棋 四維dp
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n 個格仔,每個格仔上乙個分數 非負整數 棋盤第1 格是唯一的起點,第n 格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m 張爬行卡片,分成4 種不同的型別 m 張卡片中不一定包含所有4 種型別的卡片,見樣例 每種...