ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
http://hihocoder.com/problemset/problem/1290
這題是這次微軟筆試的第三題,過的人比第一題少一點(diǎn),這題一眼看過去就是動(dòng)態(tài)規(guī)劃,不過轉(zhuǎn)移方程貌似不是很簡(jiǎn)單,調(diào)試了比較久才正確,不過好在是1A,但是最后只留了一個(gè)小時(shí)多一點(diǎn)給B題,也導(dǎo)致了B題最后也沒能AC掉。首先狀態(tài)是很好確定的p[i][j][k]表示走到第i行第j個(gè)格子時(shí),方向是k的情況下的最小改變格子數(shù)目。(k?from?{0,?1})而且由于只有往下和往右走,所以中間過程進(jìn)行轉(zhuǎn)移時(shí)改變的格子不會(huì)影響后續(xù)過程中的轉(zhuǎn)移,所以只需要分析p[i][j][0]和p[i][j][1]分別怎么由上面和左邊的格子得到。情況比較多,基本上在代碼里就可以看明白,不過需要對(duì)幾處邊界條件判斷一下,比如第一列無法由左邊格子得到,第一行無法由上面的格子得到,還有就是向下和向右撞到邊界的時(shí)候。
?
代碼:
#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?
轉(zhuǎn)載于:https://www.cnblogs.com/andyqsmart/p/5371463.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的ACM学习历程—Hihocoder 1290 Demo Day(动态规划)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (四)C语言柔性数组、指针赋值
- 下一篇: MFC中快速应用OpenCV教程