这次的在线笔试
说多了都是泪。。
第一题很快就写出来了,第二题本来也是有想着用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;
}