洛谷 SHOI2002 滑雪 dp

2021-10-06 18:26:58 字數 1543 閱讀 3594

題目鏈結

題意:

給你乙個二維陣列,每個點有乙個權值(山的高度),現在只能從高度高的點往下移動,問最長路徑是多少。

思路:

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 ...