題目鏈結
題意:
給你乙個二維陣列,每個點有乙個權值(山的高度),現在只能從高度高的點往下移動,問最長路徑是多少。
思路:
dp思想,尋找最優子結構,很容易知道,在乙個點,以這個點為結束點的最長路徑為:以其四周(上下左右)的點為結束點的前乙個點的最大值加一(前提是他的高度大於結束點)。
本來以為自己親手a掉了,高興壞了,結果還是wa了,為什麼呢?以為dp思想要求無後效性(也就是前面的結果對後面的子結構不會有影響,官方定義為:某階段的狀態一旦確定,則此後過程的演變不再受此前各種狀態及決策的影響),那麼我們就要用乙個優先佇列作為輔助,讓高度低的點排在前面(因為低的點最開始不可能對高的點有影響,而先算高的點,後面的低的點會被前面的高的點所約束)
ac**
#include
inline
intread()
while
(c >=
'0'&& c <=
'9')
return x*s;
}using
namespace std;
#define newnode (treenode *)malloc(sizeof(treenode))
#define mem(a,b) memset(a,b,sizeof(a))
const
int n =
1e5+5;
const
long
long infinf =
0x7f7f7f7f7f7f7f
;const
int inf =
0x3f3f3f3f
;const
double eps =
1e-7
;const
unsigned
long
long mod =
998244353
;const
double ii =
acos(-
1);const
double pp =
(ii*
1.0)/(
180.00);
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef pair<
int,
int> pii;
typedef pair piil;
struct node};
priority_queue q;
int arr[
105]
[105];
intmain()
;for
(int i =
1;i <= n;i++))
;}}while
(!q.
empty()
) cout << max << endl;
}
SHOI2002 滑雪 動態規劃
輸入的第一行為表示區域的二維陣列的行數r和列數c 1 r,c 100 下面是r行,每行有c個數,代表高度 兩個數字之間用1個空格間隔 輸出區域中最長滑坡的長度。輸入樣例 1 5 51 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11...
洛谷 P1434 SHOI2002 滑雪
michael 喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael 想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 1...
洛谷P1434 SHOI2002 滑雪
michael喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...