加勒比海盜的寶藏
時間限制: 1 sec 記憶體限制
: 128 mb
題目描述
探險家在乙個島嶼的山洞裡發現了加勒比海盜的寶藏,但是不小心觸動了開關,他現在只能迅速地脫身,當然,不能空手離開,於是他邊跑邊把腳邊的寶藏拿走。他只能往前走(前方指下一行),但是可以考慮正前、偏左和偏右兩個三個方向,請你幫幫他讓他逃生的同時拿到最多的寶藏。
例如,探險家在左上角的位置,洞口在最後一行,洞中財寶數如下列所示,則探險家能得到的最多財寶數是15.
1 2 3
4 5 6
7 8 9
輸入第一行c,測試資料的組數
每組資料第一行m n,表示山洞有m行,
n列,後面m行
n列資料表示每個位置的財寶數。假設探險家的位置在0行
0列,山洞口在
m-1行。 輸出
每個測試資料輸出1行,探險家能得到的最多財寶數。
樣例輸入
3 3
1 2 3
4 5 6
7 8 9
4 3
1 2 3
4 5 6
7 8 9
20 1 2
樣例輸出
#include
using namespace std;
int a[108][108],b[108][108];
int m,n;
int maxsum(int i,int j)
/*if(b[i][j]!=0)
return b[i][j];*/
//不加這個會導致重複計算 可能會超時
if(i==m)
return a[i][j];
int x,y,z,t;
x=maxsum(i+1,j);
y=maxsum(i+1,j-1);
z=maxsum(i+1,j+1);
t=max(x,y);
t=max(t,z);
return b[i][j]=t+a[i][j];
int main()
int t;
cin>>t;
while(t--)
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
memset(b,0,sizeof(b));
maxsum(1,1);
/*for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cout另一種不用遞迴,直接從下往上找。
#include
int main()
int c;
scanf("%d",&c);
while(c--)
int m,n;
scanf("%d%d",&m,&n);
int a[100][100],b[100][100];
int i,j;
for(i=0;ia[i][0]=0;
a[i][n+1]=0;
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(i=0;ib[i][0]=0;
b[i][n+1]=0;
for(j=1;j<=n;j++)
b[m-1][j]=a[m-1][j];
int x,y,z;
for(i=m-1;i>=0;i--)
for(j=1;j<=n;j++)
x=b[i][j-1]+a[i-1][j];
y=b[i][j]+a[i-1][j];
z=b[i][j+1]+a[i-1][j];
b[i-1][j]=x>y?x:y;
b[i-1][j]=b[i-1][j]>z?b[i-1][j]:z;
printf("%d\n",b[0][1]);
return 0;
貪心演算法 加勒比海盜 最優裝載問題
有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎就失去了它的價值。雖然海盜船足夠大,但載重量為c,每件古董的重量為wi,海盜們該如何把盡可能多數量的寶貝裝上海盜船呢?include 呼叫sort函式的標頭檔案 includeusing namespace std c 定...
貪心 加勒比海盜船 最優裝載問題
在北美洲東南部,有一片神秘的海域,那裡碧海藍天 陽光明媚,這正是傳說中海盜最活躍的加勒比海。17 世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎...
加勒比海盜船 最優裝載問題 貪心演算法
在北美洲東南部,有一片神秘的海域,那裡碧海藍天 陽光明媚,這,正式傳說中海盜最活躍的加勒比海 caribbean sea 17世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜們不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,...