2423: [HAOI2010]最长公共子序列 - #include <Seter> - using namespace Orz;

2423: [HAOI2010]最长公共子序列

Seter posted @ 2011年8月11日 15:52 in BZOJ with tags DP HAOI , 3577 阅读

http://www.zybbs.org/JudgeOnline/problem.php?id=2423

 

RunID User Problem Result Memory Time Language Code Length Submit Time
141235 testSeter 2423 Accepted 844 kb 1008 ms C 1360 B 2011-08-11 15:29:10

这是一道水题……直接DP+容斥原理乱搞就可以AC……但是我足足做了4小时,被Tim大神从头BS到脚才做出来……

这次我的程序写的不是很难看……所以不写题解了……直接看代码吧……

不过这个故事告诉我们几个道理:

1.不要随便贴原来的代码……要贴也看清楚题目再贴……

2.大神都很喜欢BS弱菜……

3.作为弱菜也不要随便怀疑自己的代码……可能是输入错了囧……gets不行就上scanf罢……反正ACC爆低了……

4.对拍!!错了就拍!!对了也拍!!要是拍了我就可以发现我的第一个代码是对的了啊!!

5.要写题解……避免自己看不懂自己的代码……

于是我就写了这个……

 

#include <stdio.h>
#define maxn 5010
char a[maxn]=".",b[maxn]=".";
int f[2][maxn][2];
main(){
	int i,j;
	scanf("%s%s",a+1,b+1);
	f[0][0][1]=f[1][0][1]=1;
	for(i=0;b[i];i++)f[0][i][1]=1;
	for(i=1;a[i];i++)for(j=1;b[j];j++){
		if(a[i]==b[j]){
			f[i&1][j][0]=f[i&1^1][j-1][0]+1;
			f[i&1][j][1]=f[i&1^1][j-1][1];
			if(f[i&1^1][j][0]>f[i&1][j][0]){
				f[i&1][j][0]=f[i&1^1][j][0];
				f[i&1][j][1]=f[i&1^1][j][1];
			}else if(f[i&1^1][j][0]==f[i&1][j][0]){
				f[i&1][j][1]+=f[i&1^1][j][1];
				f[i&1][j][1]%=100000000;
			}if(f[i&1][j-1][0]>f[i&1][j][0]){
				f[i&1][j][0]=f[i&1][j-1][0];
				f[i&1][j][1]=f[i&1][j-1][1];
			}else if(f[i&1][j-1][0]==f[i&1][j][0]){
				f[i&1][j][1]+=f[i&1][j-1][1];
				f[i&1][j][1]%=100000000;
			}
		}else{
			f[i&1][j][0]=f[i&1^1][j][0];
			f[i&1][j][1]=f[i&1^1][j][1];
			if(f[i&1][j-1][0]>f[i&1][j][0]){
				f[i&1][j][0]=f[i&1][j-1][0];
				f[i&1][j][1]=f[i&1][j-1][1];
			}else if(f[i&1][j-1][0]==f[i&1][j][0]){
				f[i&1][j][0]=f[i&1][j-1][0];
				f[i&1][j][1]+=f[i&1][j-1][1];
				if(f[i&1^1][j-1][0]==f[i&1][j][0])f[i&1][j][1]-=f[i&1^1][j-1][1];
				f[i&1][j][1]%=100000000;
			}
		}
	}printf("%d\n%d\n",f[i&1^1][j-1][0]-1,f[i&1^1][j-1][1]);
	return 0;
}
By Seter

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee