題目背景
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。
烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數(非負整數)。棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。
沒有使用過的爬行卡片,控制烏龜棋子前進相應的格仔數,每張卡片只能使用一次。遊戲中,烏龜棋子自動獲得起點格仔的分數,並且在後續的爬行中每到達乙個格仔,就得到該格仔相應的分數。玩家最終遊戲得分就是烏龜棋子從起點到終點過程中到過的所有格仔的分數總和。很明顯,用不同的爬行卡片使用順序會使得最終遊戲的得分不同,小明想要找到一種卡片使用順序使得最終遊戲得分最多。
現在,告訴你棋盤上每個格仔的分數和所有的爬行卡片,你能告訴小明,他最多能得到多少分嗎?
輸入
輸入的每行中兩個數之間用乙個空格隔開。
第1行2個正整數n和m,分別表示棋盤格仔數和爬行卡片數。
第2行n個非負整數,a1, a2,......, an,其中ai表示棋盤第i個格仔上的分數。
第3行m個整數,b1,b2,......, bm,表示m張爬行卡片上的數字。輸入資料保證到達終點時剛好用光m張爬行卡片,即
輸出
輸出只有1行,1個整數,表示小明最多能得到的分數。
樣例輸入
9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1
樣例輸出
73提示
【輸入輸出樣例說明】
小明使用爬行卡片順序為1,1,3,1,2,得到的分數為6+10+14+8+18+17=73。注意,由於起點是1,所以自動獲得第1格的分數6。
我說這是dp沒人反駁吧(暴力dalao退下)
就是類似於在額定步數內求能到達的值的最大值
現在給了一條標了值的數軸和四個變數,分別表示能走1-4步的次數
則一開始定義這些東西
1然後就是dp(草,這麼草率的嗎intn,m;//點數和卡數
2int point[351
];//表示第幾個點所表示的數值
3int card[5]=;//表示每種牌有幾張
4int dp[41][41][41][41]=;//將初始時的點數初始化為0
哦不我們先寫一下輸入
1 scanf("現在我們有了n和m,以及乙個表示每個點值的陣列以及四個表示卡牌數量的陣列%d%d
",&n,&m);
2for(int i=1;i<=n;i++)
3 scanf("
%d",&point[i]);
4for(int i=1;i<=m;i++)
5
於是乎開始dp
而且很明顯此時的值是冗餘的,可以靠手牌分別消耗的多少算出
別問我怎麼知道的(zhx講了)
則可以將陣列從五維變成四維
降低複雜度
1陣列dp[a][b][c][d]表示的是在四張卡牌數量分別為abcd是所能得到的最大分數for(int a=0;a<=card[1];a++)
2for(int b=0;b<=card[2];b++)
3for(int c=0;c<=card[3];c++)
4for(int d=0;d<=card[4];d++)
5 dp[a][b][c][d]=max(max(max(dp[max(0,a-1)][b][c][d],dp[a][max(0,b-1)][c][d]),dp[a][b][max(0,c-1)][d]),dp[a][b][c][max(0,d-1)])+point[1+a+2*b+3*c+4*d]
想要求到它則需要四個不同到達方法(也就是從前一二三四個格仔分別過來)
在這四種情況中選最優解
然後再尋找從1到n的最大值(因為)
ac**如下
#include#includeend又水了一篇#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
intn,m;
int point[351
];int card[5]=;
int dp[41][41][41][41]=;
intmain()
for(int a=0;a<=card[1];a++)
for(int b=0;b<=card[2];b++)
for(int c=0;c<=card[3];c++)
for(int d=0;d<=card[4];d++)
dp[a][b][c][d]=max(max(max(dp[max(0,a-1)][b][c][d],dp[a][max(0,b-1)][c][d]),dp[a][b][max(0,c-1)][d]),dp[a][b][c][max(0,d-1)])+point[1+a+2*b+3*c+4*d];
printf("%d
",dp[card[1]][card[2]][card[3]][card[4
]]);
return0;
}
洛谷 P1541 烏龜棋
題目背景 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別...
洛谷P1541 烏龜棋
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...
洛谷P1541 烏龜棋
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...