遊玩景點
Time Limit:1000MS Memory Limit:65536K
Total Submit:182 Accepted:35
Description
DieIng五一要去旅遊,旅遊區的景點道路分布欣賞景點的道路為東西走向,每條道路有DieIng對它的喜愛值;南北走向為林間小道,供休息用。
由於五一遊客較多,旅遊區規定欣賞景點的道路只能單向行走,自東向西走;林間小道可雙向行走。
DieIng要你幫他設計路線(可以從任意點開始,任意點結束),使得他能玩得最high。(喜愛值的總和最大)
Input
第一行是兩個整數N(0 <= N <= 10) 和M(0 <= M <= 1000000), 代表旅遊區的布局,N*M
接下來N行,每行有M個整數favorite(-100 <= favorite<=100)
N,M==0結束。
Output
輸出DieIng能得到最大的喜愛值總和。
Sample Input
3 45 -4 6 14-2 -48 11 -89 -13 4 80 0
Sample Output
30
Source
GDUT Programming Contest 2009 by longshen
/*----------------------------------------------------------------------------------大概想法:1、看到的題目的要輸入最大值的時候,第一感覺就是要用DP或者貪心來做,然後再去看看有 沒有最優子結構什麼的,果然有,最後通過的景點最大值必然是以最大值通過前一個景點, 然後什麼獨立子問題的不會分析,先試試用DP。2、在寫遞迴解的時候,突然間覺得這個題目貌似見過。題目的樣本輸出是30,也就是每一列的 最大值加起來。如果用暴力法求解的話,就需要遍曆出每一列的最大值,然後根據逐一相加 求出最大值,這樣做的話估計會逾時。可不可以降低時間複雜度?剛才說到了“其實就是求 出每一列的最大值”,這一句提示了我。我可以求出每一列的最大值,然後將它們放到另外 一個數組中或者覆蓋原數組中該元素的位置,從而構造出一個由列最大值組成的數組,然後 再來看看,這一個問題其實就轉化為求最大子數組之和的問題。 詳細見代碼----------------------------------------------------------------------------------*/#include<stdio.h>#define max(x,y) ((x)>(y) ? (x) : (y))long a[1000004] ;long b[1000004] ;//空間其實也可以最佳化,覆蓋原來的位置int main(void){long N = 0 ;long M = 0 ;long i = 0 ;long j = 0 ;long nFavSum = 0 ;long nTemp = 0 ;long nTotal = 0 ;while(scanf("%ld%ld",&N,&M), (N != 0 && M != 0)){nFavSum = 0 ;nTemp = 0 ;nTotal = 0 ;for(i = 0 ; i < N ; ++i){for(j = 0 ; j < M ; ++j){scanf("%ld",&nTemp) ;if(0 == i){a[nTotal++] = nTemp ;}else if(nTemp > a[j]){a[j] = nTemp ;}}}b[0] = a[0] ;nFavSum = 0 ; for(i = 1 ; i < M ; ++i){b[i] = max(a[i],b[i-1]+a[i]) ;if(nFavSum < b[i]){nFavSum = b[i] ;}}printf("%ld\n",nFavSum) ;}return 0 ;}