日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ACM学习历程—Hihocoder 1290 Demo Day(动态规划)

發布時間:2024/6/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACM学习历程—Hihocoder 1290 Demo Day(动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://hihocoder.com/problemset/problem/1290

這題是這次微軟筆試的第三題,過的人比第一題少一點,這題一眼看過去就是動態規劃,不過轉移方程貌似不是很簡單,調試了比較久才正確,不過好在是1A,但是最后只留了一個小時多一點給B題,也導致了B題最后也沒能AC掉。首先狀態是很好確定的p[i][j][k]表示走到第i行第j個格子時,方向是k的情況下的最小改變格子數目。(k?from?{0,?1})而且由于只有往下和往右走,所以中間過程進行轉移時改變的格子不會影響后續過程中的轉移,所以只需要分析p[i][j][0]和p[i][j][1]分別怎么由上面和左邊的格子得到。情況比較多,基本上在代碼里就可以看明白,不過需要對幾處邊界條件判斷一下,比如第一列無法由左邊格子得到,第一行無法由上面的格子得到,還有就是向下和向右撞到邊界的時候。

?

代碼:

#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <vector> #include <string> #define LL long longusing namespace std;int n, m; char str[105][105]; int p[105][105][2];void input() {for (int i = 0; i < n; ++i)scanf("%s", str[i]);memset(p, -1, sizeof(p)); }void work() {int t;if (str[0][0] == '.') p[0][0][0] = 0;else p[0][0][0] = 1;if (m == 1 || str[0][1] == 'b') p[0][0][1] = 0;else p[0][0][1] = 1;for (int i = 0; i < n; ++i){for (int j = 0; j < m; ++j){if (i == 0 && j == 0) continue;if (j == 0){//leftif (i+1 == n || str[i+1][j] == 'b')p[i][j][0] = p[i-1][j][1];elsep[i][j][0] = p[i-1][j][1]+1;if (str[i][j] == 'b') p[i][j][0]++;//bottomp[i][j][1] = p[i-1][j][1];if (str[i][j] == 'b') p[i][j][1]++;}else{//leftp[i][j][0] = p[i][j-1][0];if (str[i][j] == 'b') p[i][j][0]++;if (i > 0){t = p[i-1][j][1];if (str[i][j] == 'b') t++;if (i+1 == n || str[i+1][j] == 'b')p[i][j][0] = min(p[i][j][0], t);elsep[i][j][0] = min(p[i][j][0], t+1);}//bottomp[i][j][1] = p[i][j-1][0];if (str[i][j] == 'b') p[i][j][1]++;if (!(j+1 == m || str[i][j+1] == 'b'))p[i][j][1]++;if (i > 0){t= p[i-1][j][1];if (str[i][j] == 'b') t++;p[i][j][1] = min(p[i][j][1], t);}}}}printf("%d\n", min(p[n-1][m-1][0], p[n-1][m-1][1])); }int main() {//freopen("test.in", "r", stdin);while (scanf("%d%d", &n, &m) != EOF){input();work();}return 0; } View Code

?

轉載于:https://www.cnblogs.com/andyqsmart/p/5371463.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的ACM学习历程—Hihocoder 1290 Demo Day(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。