1. 程式人生 > 其它 >動態規劃:洛谷 P1314 [SHOI2002]滑雪

動態規劃:洛谷 P1314 [SHOI2002]滑雪

洛谷 P1314 [SHOI2002]滑雪

 

考的是動態規劃,一題普及/提高-的題,我以前用的是bfs做的,動態規劃是如此的方便快捷美妙,就是這題要考慮動態規劃的無後效性,所有要用 優先佇列,從高度最小的開始DP,從低到高。

 

 我的題解:

 1 //洛谷 P1314     [SHOI2002]滑雪
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 struct xue
 7 {
 8     int x, y, data;
 9 }a[10005
]; 10 bool cmp(xue a, xue b) 11 { 12 return a.data < b.data; 13 }//因為動態規劃很重要的一個特點就是無後效性,所以我們最好從高度最小的 14 //格子開始動規 所以我們要用結構體儲存 並排序 用優先佇列解決問題 15 int snow[101][101]; 16 int num[101][101]; 17 int mov[4][2] = { 0,1,1,0,-1,0,0,-1 };//建立移動陣列 18 int main() 19 { 20 int n, m; 21 cin >> n >> m; 22 int
k = 0; 23 for (int i = 1; i <= n; ++i) 24 for (int j = 1; j <= m; ++j) 25 { 26 cin >> snow[i][j]; 27 num[i][j] = 1;//先把每個點的num值初始化為0 自己到自己的的值是1 28 a[k].x = i;//儲存一下資料 29 a[k].y = j; 30 a[k].data = snow[i][j]; 31 k++;
32 } 33 sort(a, a + k, cmp);//排序 從小到大 34 int newx, newy; 35 for (int i = 0; i < k; ++i)//遍歷 36 { 37 for (int j = 0; j < 4; ++j)//向四個方向 38 { 39 newx = a[i].x + mov[j][0]; 40 newy = a[i].y + mov[j][1]; 41 if (newx >= 1 && newx <= n && newy >= 1 && newy <= m)//先判斷座標的合法性 42 { 43 if (a[i].data < snow[newx][newy])//四周的山更高時 44 num[newx][newy] = max(num[a[i].x][a[i].y] + 1, num[newx][newy]); 45 //重點 我一開始寫的是num+= 後來發現這樣寫是錯誤的 46 //要比較判斷一下 num[new][new]=的最優解是遍歷的這座山的num+1還是本來! 47 } 48 } 49 } 50 int ans = 0; 51 for (int i = 1; i <= n; ++i) 52 for (int j = 1; j <= m; ++j) 53 { 54 ans = max(ans, num[i][j]); 55 } 56 cout << ans; 57 58 }

 

 完美完成!