1. 程式人生 > >#18.03.09 vijos1011清帝之惑之順治

#18.03.09 vijos1011清帝之惑之順治

二維 輸入 來源 個數 傾斜 最長 esp 看看吧 ext

背景

順治帝福臨,是清朝入關後的第一位皇帝。他是皇太極的第九子,生於崇德三年(1638)崇德八年八月二ten+six日在沈陽即位,改元順治,在位18年。卒於順治十八年(1661),終24歲。

順治即位後,由叔父多爾袞輔政。順治七年,多爾袞出塞射獵,死於塞外。14歲的福臨提前親政。順治帝天資聰穎,讀書勤奮,他吸收先進的漢文化,審時度勢,對成法祖制有所更張,且不顧滿洲親貴大臣的反對,倚重漢官。為了使新興的統治基業長治久安,他以明之興亡為借鑒,警惕宦官朋黨為禍,重視整飭吏治,註意與民休息,取之有節。但他少年氣盛,剛愎自用,急噪易怒,當他寵愛的董妃去世後,轉而消極厭世,終於匆匆走完短暫的人生歷程,英年早逝。他是清朝歷史上唯一公開歸依禪門的皇帝。

描述

順治喜歡滑雪,這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待太監們來載你。順治想知道載一個區域中最長的滑坡。

區域由一個二維數組給出。數組的每個數字代表點的高度。下面是一個例子:

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

順治可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小。在上面的例子中,一條可滑行的滑坡為24-17-16-1。當然25-24-23-...-3-2-1更長。事實上,這是最長的一條。

格式

輸入格式

輸入的第一行表示區域的行數R和列數C(1 <= R,C <= 500)。下面是R行,每行有C個整數,代表高度h,0<=h<=10000。

輸出格式

輸出最長區域的長度。

樣例1

樣例輸入1

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

樣例輸出1

25

限制

各個測試點2s

來源

Vivian Snow

技術分享圖片
 1 #include <iostream>
 2 #include <string.h>
 3 #include <cstdio>
 4 #include <stdlib.h>
 5 #include <algorithm>
 6
7 using namespace std; 8 struct area 9 { 10 int x, y;//坐標 (x,y) (行,列) 11 int high;//高度 12 }; 13 14 int r, c; 15 area f[250002]; 16 int dp[505][505] = { 0 }, map[505][505]; 17 18 int comp(const void *q, const void *w) 19 { 20 return ((struct area*)q)->high - ((struct area*)w)->high; 21 } 22 23 int main() 24 { 25 int direr[4] = { 0,0,-1,1 }, direl[4] = { -1,1,0,0 }; 26 cin >> r >> c;//r行數 c列數 27 int count = 0; 28 for (int i = 1; i <= r; i++) 29 for (int j = 1; j <= c; j++) 30 { 31 cin >> f[count].high; 32 f[count].x = i; 33 f[count].y = j; 34 map[i][j] = f[count].high; 35 count++; 36 } 37 qsort(f, count, sizeof(struct area), comp); 38 for (int i = 0; i<count; i++) 39 { 40 for (int j = 0; j <= 3; j++) 41 { 42 if (map[f[i].x + direr[j]][f[i].y + direl[j]]>map[f[i].x][f[i].y]) 43 dp[f[i].x + direr[j]][f[i].y + direl[j]] = max(dp[f[i].x + direr[j]][f[i].y + direl[j]], dp[f[i].x][f[i].y] + 1); 44 } 45 } 46 int max0 = 0; 47 for (int i = 1; i <= r; i++) 48 for (int j = 1; j <= c; j++) 49 max0 = max(max0, dp[i][j]); 50 printf("%d\n", max0+1); 51 return 0; 52 }
View Code

總算是搞出來了

然而耗時實在太多

#    狀態    耗時    內存占用
#1     Accepted     197ms    7.0 MiB
#2     Accepted     49ms    3.898 MiB
#3     Accepted     73ms    3.582 MiB
#4     Accepted     27ms    2.719 MiB
#5     Accepted     128ms    6.75 MiB
#6     Accepted     26ms    2.75 MiB
#7     Accepted     11ms    2.969 MiB
#8     Accepted     99ms    6.0 MiB
#9     Accepted     32ms    3.27 MiB
#10     Accepted     90ms    6.215 MiB

到學了dp還有復雜度啥的再回過頭來看看吧………

以及順治真的喜歡滑雪麽(小小聲)

#18.03.09 vijos1011清帝之惑之順治