hihocoder 1290 -- 微軟2016校園招聘4月線上筆試-3-Demo Day
阿新 • • 發佈:2018-12-18
這次的線上筆試
說多了都是淚。。
第一題很快就寫出來了,第二題本來也是有想著用trie樹來寫的,不過不熟、嫌麻煩、畢竟渣、還作死,就直接暴力了,然後報應就是一直timeout。
感覺不服,各種細節優化一下,多次提交還是大寫的TLE。活活廢了我一個半多小時,試問人生有多少個一個半小時?
結果是第三題也沒時間寫完整提交了(敢多給我五分鐘?),測試結束後重新在hihocoder提交了一下,直接過的時候不知是高興還是淡淡的哀傷。。
又對自己的渣有了新的認識
還是說一下第三題吧,明顯的dp。
dp[i][j][0]表示到達第i行第j列的gird時最小改變的數目(此時狀態向右),dp[i][j][1]表示到達第i行第j列的gird時最小改變的數目(此時狀態向下)
不貼題目了,題目連結:http://hihocoder.com/problemset/problem/1290
C++程式碼:
#include<iostream> #include<limits.h> using namespace std; #define MAXN 103 #define MAXM 103 int dp[MAXN][MAXM][2]; char cha[MAXN][MAXM]; int n,m; int ans; int main(){ cin>>n>>m; getchar(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) cha[i][j]=getchar(); cha[i][m+1]='b'; getchar(); } for(int i=1;i<=m;i++) cha[n+1][i]='b'; dp[1][1][0]=(cha[1][1]=='.'?0:1); dp[1][1][1]=dp[1][1][0]+(cha[1][2]=='.'?1:0); for(int i=2;i<=m;i++){ dp[1][i][0]=dp[1][i-1][0]+(cha[1][i]=='.'?0:1); dp[1][i][1]=INT_MAX; } for(int i=2;i<=n;i++){ dp[i][1][1]=dp[i-1][1][1]+(cha[i][1]=='.'?0:1); dp[i][1][0]=INT_MAX; } for(int i=2;i<=n;i++){ for(int j=2;j<=m;j++){ dp[i][j][0]=min(dp[i][j-1][0],dp[i][j-1][1]+(cha[i+1][j-1]=='b'?0:1)); dp[i][j][1]=min(dp[i-1][j][1],dp[i-1][j][0]+(cha[i-1][j+1]=='b'?0:1)); if(cha[i][j]=='b'){ dp[i][j][0]++; dp[i][j][1]++; } } } ans=dp[n][m][0]>dp[n][m][1]?dp[n][m][1]:dp[n][m][0]; cout<<ans<<endl; }