【GDOI2018模拟7.10】C 动态规划
2017-07-10 14:48
357 查看
一套题目考两道DP有意思?= =
题意略。
一开始其实想的接近正解了,但是后面就歪了,莫名其妙搞到30分= =。。
%%%world_wide_D,AK大佬,瑟瑟发抖。
一开始先把dp[i][j]预处理出来,表示A的前i位和B的前j位的最长公共子序列长度。
然后设f[i][j]表示A的前i位和B的前j位中长度为dp[i][j]的序列的出现次数。
那么求出dp以后明显有两种转移:
不选择i:f[i][j]+=f[i-1][j](dp[i-1][j]==dp[i][j])
选择i:f[i][j]+=f[i-1][p-1]
p为B串前j 个字符中最靠后的与A[i]相同的字符的位置,
若dp[i− 1][p− 1] + 1 == dp[i][j],则f[i][j]+=f[i-1][p-1]最终的答案即为f
[m]。
这个应该还是挺好理解的,因为从p到j这一段的f都是相同的,所以预处理出p以后直接更新就好了。
题意略。
一开始其实想的接近正解了,但是后面就歪了,莫名其妙搞到30分= =。。
%%%world_wide_D,AK大佬,瑟瑟发抖。
一开始先把dp[i][j]预处理出来,表示A的前i位和B的前j位的最长公共子序列长度。
然后设f[i][j]表示A的前i位和B的前j位中长度为dp[i][j]的序列的出现次数。
那么求出dp以后明显有两种转移:
不选择i:f[i][j]+=f[i-1][j](dp[i-1][j]==dp[i][j])
选择i:f[i][j]+=f[i-1][p-1]
p为B串前j 个字符中最靠后的与A[i]相同的字符的位置,
若dp[i− 1][p− 1] + 1 == dp[i][j],则f[i][j]+=f[i-1][p-1]最终的答案即为f
[m]。
这个应该还是挺好理解的,因为从p到j这一段的f都是相同的,所以预处理出p以后直接更新就好了。
#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e3+5; const int mo=1e9+7; int dp[N][N],f[N][N],g[N][30]; int n,m; int pos ; char s1 ,s2 ; int main() { scanf("%s",s1+1); scanf("%s",s2+1); n=strlen(s1+1); m=strlen(s2+1); fo(i,1,n) { fo(j,1,m) { dp[i][j]=max(dp[i-1][j],dp[i][j-1]); if (s1[i]==s2[j])dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1); } } memset(pos,-1,sizeof(pos)); fo(i,1,m) { pos[s2[i]-'a']=i; fo(j,0,25)g[i][j]=pos[j]; } fo(i,0,n)f[i][0]=1; fo(i,0,m)f[0][i]=1; fo(i,1,n) { fo(j,1,m) { f[i][j]=0; int p=g[j][s1[i]-'a']; if (dp[i-1][j]==dp[i][j])f[i][j]=(f[i][j]+f[i-1][j])%mo; else if (p!=-1&&dp[i-1][p-1]+1==dp[i][j]) f[i][j]=(f[i][j]+f[i-1][p-1])%mo; } } printf("%d\n",f [m]); }
相关文章推荐
- 【jzoj5219】【GDOI2018模拟7.10】【B】【动态规划】
- 【jzoj5220】【GDOI2018模拟7.10】【C】【动态规划】
- 【GDOI2018模拟7.10】B 动态规划
- JZOJ5220. 【GDOI2018模拟7.10】C(2017.8DP&贪心专题)
- 【GDOI2018模拟7.10】C
- 【JZOJ5219】【GDOI2018模拟7.10】B
- 【GDOI2018模拟7.10】C
- JZOJ 5221. 【GDOI2018模拟7.10】A
- 【JZOJ5220】【GDOI2018模拟7.10】C
- 【jzoj5237】【GDOI2018模拟8.7】【最长公共子序列 】【动态规划】
- jzoj5220 【GDOI2018模拟7.10】C (双序列dp)
- 【jzoj5221】【GDOI2018模拟7.10】【A】【线段树合并】
- 【GDOI2018模拟7.10】B
- 【GDOI2018模拟7.10】B
- 【GDOI2018模拟7.10】C
- 【jzoj5251】【GDOI2018模拟8.11】【决战】【状态压缩动态规划】
- 【JZOJ 5220】【GDOI2018模拟7.10】C
- 【GDOI2018模拟9.16】幽雅的绽放吧,墨染之樱
- 【JZOJ5237】【GDOI2018模拟8.7】最长公共子序列
- 【JZOJ 5241】【GDOI2018模拟8.8】苹果和雪梨