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

扫描二维码关注公众号,回复: 4555693 查看本文章


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;
}  




猜你喜欢

转载自blog.csdn.net/hqw11/article/details/51080213
今日推荐