題目背景
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。
題目描述
烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數(非負整數)。棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。
烏龜棋中m張爬行卡片,分成4種不同的型別(m張卡片中不一定包含所有4種型別的卡片,見樣例),每種型別的卡片上分別標有1、2、3、4四個數字之一,表示使用這種卡片後,烏龜棋子將向前爬行相應的格仔數。遊戲中,玩家每次需要從所有的爬行卡片中選擇一張之前沒有使用過的爬行卡片,控制烏龜棋子前進相應的格仔數,每張卡片只能使用一次。
遊戲中,烏龜棋子自動獲得起點格仔的分數,並且在後續的爬行中每到達乙個格仔,就得到該格仔相應的分數。玩家最終遊戲得分就是烏龜棋子從起點到終點過程中到過的所有格仔的分數總和。
很明顯,用不同的爬行卡片使用順序會使得最終遊戲的得分不同,小明想要找到一種卡片使用順序使得最終遊戲得分最多。
現在,告訴你棋盤上每個格仔的分數和所有的爬行卡片,你能告訴小明,他最多能得到多少分嗎?
輸入輸出格式
輸入格式:
輸入檔案的每行中兩個數之間用乙個空格隔開。
第1行2個正整數n和m,分別表示棋盤格仔數和爬行卡片數。
第2行n個非負整數,a1a2……an,其中ai表示棋盤第i個格仔上的分數。
第3行m個整數,b1b2……bm,表示m張爬行卡片上的數字。
輸入資料保證到達終點時剛好用光m張爬行卡片。
輸出格式:
輸出只有1行,1個整數,表示小明最多能得到的分數。
輸入輸出樣例
輸入樣例#1
9 5輸出樣例#1 說明6 10 14 2 8 8 18 5 17
1 3 1 2 1
每個測試點1s
小明使用爬行卡片順序為1,1,3,1,2,得到的分數為6+10+14+8+18+17=73。注意,由於起點是1,所以自動獲得第1格的分數6。
對於30%的資料有1≤n≤30,1≤m≤12。
對於50%的資料有1≤n≤120,1≤m≤50,且4種爬行卡片,每種卡片的張數不會超過20。
對於100%的資料有1≤n≤350,1≤m≤120,且4種爬行卡片,每種卡片的張數不會超過40;0≤ai≤100,1≤i≤n;1≤bi≤4,1≤i≤m。
分析
由於第i步所能獲得的最大總分數顯然依賴於之前的所獲得的分數,故考慮使用動態規劃求解。又因為每張片
只能使用一次,所以,用dp[i][j][k][s]的下標來表示每張卡片的使用情況,而其值表示在使用i張1,j張2,k
張3,s張4時所能獲得的最大分數。僅考慮前一步的情況,dp[i][j][k][s]可能由遞推而來,故取它們中的最大值加上第i步所在格仔的分數,便是第i步
的最大總分數。故可設計出狀態轉移方程:
dp[i][j][k][s]=max(dp[i-1][j][k][s],dp[i][j-1][k][s],dp[i][j][k-1][s],dp[i][j][k][s-1])+當前格仔所得分數。
**如下:
#include
using
namespace
std;
int dp[50][50][50][50];//存放每一種狀態,
int v[500],p[500],num[5];//分別存放當前格仔的分數,每張卡片的移動距離及每種卡片的張數
int n,m;
int max(int a,int b)
int main()
memset(dp,-1,sizeof(dp));//初始化
dp[0][0][0][0]=v[1]; //初狀態:一張也不選時,棋在起點,分數為v[1]
for(int i=0;i<=num[1];i++)
for(int j=0;j<=num[2];j++)
for(int k=0;k<=num[3];k++)
for(int s=0;s<=num[4];s++)//四重迴圈列舉每種狀態,複雜度為o(n^4);
printf("%d",dp[num[1]][num[2]][num[3]][num[4]]);//末狀態,由題可確定最終狀態必定每張卡片都用完
return0;}
}
NOIP2010提高組 烏龜棋
這題一眼dp,本來是設五維的 但是,咳咳,空超了!如何?我們在仔細地看一看dp陣列 我們可以發現,因為,當我們確定了剩下的卡片,我們就能確定了它當前所在的位置是 所以,我們可以直接將i去掉,perfect!那這樣的話,我們只要設四維就可以了。include define max x,y x xusi...
NOIP2010 提高組 烏龜棋 (線性dp
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤只有一行,該行有 n 個格仔,每個格仔上乙個分數 非負整數 棋盤第 1 格是唯一的起點,第 n 格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中共有 m 張爬行卡片,分成 4 種不同的型別 m 張卡片中不一定包含所有 4 ...
NOIP 2010提高組題解
這是同機房一位巨佬在ak ioi之後發表的感言。為了學習他的這種精神 我太菜了,但我也想像他一樣ak ioi qaq 這篇題解就誕生了。戰車被馬拉著 直接模擬。注意入隊的時候打上標記,出隊的時候清楚標記,每次查詢的時候直接o 1 o 1 o 1 查詢標記即可。時間複雜度o n o n o n 一直在...