1. 程式人生 > >hihocoder 1290 -- 微軟2016校園招聘4月線上筆試-3-Demo Day

hihocoder 1290 -- 微軟2016校園招聘4月線上筆試-3-Demo Day

這次的線上筆試

說多了都是淚。。


第一題很快就寫出來了,第二題本來也是有想著用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;
}