小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。
烏龜棋的棋盤是一行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 56 10 14 2 8 8 18 5 17
1 3 1 2 1
輸出樣例#1:
複製
73
每個測試點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。
暴力搜尋20分
#include#include#define maxn 352
using namespace std;
int map[maxn];
int cards[122];
bool book[122];
int dp[maxn];
int n, m;
int ans;
void dfs(int deepth,int now)
//if (dp[deepth] > 0)
// return dp[deepth];
for (int i = 1; i <= m;i++)
if (!book[i])
//return dp[deepth] = now;
}int main()
正確思路:
因為題目給出了四種牌,用乙個斯維陣列dp【a】【b】【c】【d】代表第一種牌a張,代表第二種牌b張,代表第三種牌c張,代表第四種牌d張時獲得的最大分數
相應的某一狀態由四個狀態轉移過來,即第一種不選、第二種不選、第三種不選、第四種不選
dp【a】【b】【c】【d】=max(dp【a】【b】【c】【d】,dp【a-1】【b】【c】【d】,dp【a】【b-1】【c】【d】,dp【a】【b】【c-1】【d】,dp【a】【b】【c】【d-1】)+map【step】;
step=a+b*2+c*3+d*4+1;
#include#include#include#define maxn 43
using namespace std;
int map[352];
int dp[maxn][maxn][maxn][maxn];
int g[5];
int n, m;
int main()
dp[0][0][0][0] = map[1];
for (int a = 0; a <= g[1];a++)
for (int b = 0; b <= g[2];b++)
for (int c = 0; c <= g[3];c++)
for (int d = 0; d <= g[4]; d++)
cout << dp[g[1]][g[2]][g[3]][g[4]] << endl;
return 0;
}
記憶化搜尋寫法
#include#include#include#define maxn 43
using namespace std;
int map[352];
int dp[maxn][maxn][maxn][maxn];
int g[5];
int n, m;
int ans;
int dfs(int c1, int c2, int c3, int c4)
int main()
dp[0][0][0][0] = map[1];
ans = dfs(g[1], g[2], g[3], g[4]);
cout << ans << endl;
return 0;
}
洛谷 P1541 烏龜棋
題目背景 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別...
洛谷P1541 烏龜棋
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...
洛谷 p1541烏龜棋
洛谷 p1541烏龜棋 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行nn個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第nn格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中mm張爬行卡片,分成4種不同的型別 mm張卡片中不一定包含所有44種型別...