NOIP2010 tortoise 烏龜棋

問題描述:ios

小明過生日的時候,爸爸送給他一副烏龜棋看成禮物。c++

烏龜棋的棋盤是一行n 個格子,每一個格子上一個分數(非負整數)。棋盤第1 格是惟一的起點,第n 格是終點,遊戲要求玩家控制一個烏龜棋子從起點出發走到終點。spa

 

烏龜棋中m 張爬行卡片,分紅4 種不一樣的類型(m 張卡片中不必定包含全部4 種類型的卡片,見樣例),每種類型的卡片上分別標有一、二、三、4 四個數字之一,表示使用這種卡片後,烏龜棋子將向前爬行相應的格子數。遊戲中,玩家每次須要從全部的爬行卡片中選擇一張以前沒有使用過的爬行卡片,控制烏龜棋子前進相應的格子數,每張卡片只能使用一次。code

遊戲中,烏龜棋子自動得到起點格子的分數,而且在後續的爬行中每到達一個格子,就獲得該格子相應的分數。玩家最終遊戲得分就是烏龜棋子從起點到終點過程當中到過的全部格子的分數總和。blog

很明顯,用不一樣的爬行卡片使用順序會使得最終遊戲的得分不一樣,小明想要找到一種卡片使用順序使得最終遊戲得分最多。遊戲

如今,告訴你棋盤上每一個格子的分數和全部的爬行卡片,你能告訴小明,他最多能獲得多少分嗎?ci

輸入格式:it

輸入文件名tortoise.in。輸入文件的每行中兩個數之間用一個空格隔開。io

第1 行2 個正整數n 和m,分別表示棋盤格子數和爬行卡片數。table

第2 行n 個非負整數,a1,a2,……,an,其中ai 表示棋盤第i 個格子上的分數。

第3 行m 個整數,b1,b2,……,bm,表示m 張爬行卡片上的數字。

輸入數據保證到達終點時恰好用光m 張爬行卡片,即。

輸出格式:

輸出文件名tortoise.out。

輸出只有1 行,1 個整數,表示小明最多能獲得的分數。

 

輸入輸出樣例

tortoise.in

tortoise.out

9 5

6 10 14 2 8 8 18 5 17

1 3 1 2 1

73

tortoise.in

tortoise.out

13 8

4 96 10 64 55 13 94 53 5 24 89 8 30

1 1 1 1 1 2 4 1

455

輸入輸出樣例 1 說明

小明使用爬行卡片順序爲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。

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;  5 int n,m;  6 int f[45][45][45][45],score[350],b[350],num[10],x;  7 int main()  8 {  9     freopen("tortoise.in","r",stdin); 10     freopen("tortoise.ans","w",stdout); 11     cin>>n>>m; 12     for(int i=0;i<n;i++) 13         cin>>score[i]; 14     for(int i=0;i<m;i++) 15  { 16         cin>>b[i]; 17         num[b[i]]++; 18  } 19     f[0][0][0][0]=score[0]; 20     for(int a=0;a<=num[1];a++) 21       for(int b=0;b<=num[2];b++) 22         for(int c=0;c<=num[3];c++) 23           for(int d=0;d<=num[4];d++) 24  { 25               x=a+b*2+c*3+d*4; 26               if(a>0) f[a][b][c][d]=max(f[a-1][b][c][d]+score[x],f[a][b][c][d]); 27               if(b>0) f[a][b][c][d]=max(f[a][b-1][c][d]+score[x],f[a][b][c][d]); 28               if(c>0) f[a][b][c][d]=max(f[a][b][c-1][d]+score[x],f[a][b][c][d]); 29               if(d>0) f[a][b][c][d]=max(f[a][b][c][d-1]+score[x],f[a][b][c][d]); 30  } 31     cout<<f[num[1]][num[2]][num[3]][num[4]]<<endl; 32     return 0; 33 }

 

 

 

相關文章
相關標籤/搜索