ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
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(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (四)C语言柔性数组、指针赋值
- 下一篇: MFC中快速应用OpenCV教程