BZOJ2423/HAOI2010 最长公共子序列
2016-03-05 23:02
357 查看
思路:
非常经典的问题就不讲了。后面求方案的时候注意不要忘记讨论情况。
还有要滚动一维。
非常经典的问题就不讲了。后面求方案的时候注意不要忘记讨论情况。
还有要滚动一维。
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; const int imax=5000+9; const int mod=1e8; char s1[imax],s2[imax]; int n,m; int f[2][imax],g[2][imax]; void iread() { scanf(" %s",s1+1); scanf(" %s",s2+1); n=strlen(s1+1); m=strlen(s2+1); n--; m--; } void iwork() { for(int i=0;i<=m;i++) g[0][i]=1; g[1][0]=1; int now,pre; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { now=i&1; pre=now^1; if(s1[i]==s2[j]) { f[now][j]=f[pre][j-1]+1; g[now][j]=g[pre][j-1]; if(f[now][j]==f[pre][j]) g[now][j]+=g[pre][j]; if(f[now][j]==f[now][j-1]) g[now][j]+=g[now][j-1]; g[now][j]=(g[now][j]+mod)%mod; } else { f[now][j]=max(f[pre][j],f[now][j-1]); if(f[now][j-1]!=f[pre][j]) { if(f[now][j-1]>f[pre][j]) g[now][j]=g[now][j-1]; else g[now][j]=g[pre][j]; } else g[now][j]=(g[pre][j]+g[now][j-1]); if(f[pre][j-1]==f[now][j]) g[now][j]-=g[pre][j-1]; g[now][j]=(g[now][j]+mod)%mod; } } printf("%d\n",f[now][m]); printf("%d\n",g[now][m]); } int main() { iread(); iwork(); return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- Leetcode 91. Decode Ways JAVA语言