首页 > dp专题练习

dp专题练习

 

这是一篇很水的blog

扫雷

link

一道很水的dp,考虑上一上,这一行,与下一行是否有雷即可

#include
#include
#include
#include
using namespace std;
inline long long read()
{long long f=1,ans=0;char c;while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}return f*ans;
}
long long dp[10001][3][3][3],n,a[90001],ans;
int main()
{n=read();for(long long i=1;i<=n;i++) a[i]=read();dp[0][0][0][1]=dp[0][0][0][0]=1;for(long long i=1;i<=n;i++){if(a[i]==1){dp[i][1][0][0]+=(dp[i-1][0][0][1]+dp[i-1][0][1][1]);dp[i][0][1][0]+=(dp[i-1][1][0][0]+dp[i-1][1][1][0]);dp[i][0][0][1]+=(dp[i-1][0][0][0]+dp[i-1][0][1][0]);}if(a[i]==3) dp[i][1][1][1]+=(dp[i-1][1][0][1]+dp[i-1][1][1][1]);if(a[i]==2){dp[i][1][1][0]+=(dp[i-1][1][0][1]+dp[i-1][1][1][1]);dp[i][1][0][1]+=(dp[i-1][0][0][1]+dp[i-1][0][1][1]);dp[i][0][1][1]+=(dp[i-1][1][0][0]+dp[i-1][1][1][0]); } if(a[i]==0) dp[i][0][0][0]+=(dp[i-1][0][0][0]+dp[i-1][0][1][0]);}for(long long i=0;i<=1;i++)for(long long z=0;z<=1;z++)for(long long k=0;k<=0;k++) ans+=dp[n][i][z][k];cout<<ans;
}
View Code

 

子串

link

考试时的做法十分神奇,并没有想到dp,所以用了KMP,搜索等玄学技巧

最后CE了,以为写了个pow数组,这是个关键字(要不得30分)

#include
#include
#include
#include
#define mod 1000000007
using namespace std;
inline long long read()
{long long f=1,ans=0;char c;while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}return f*ans;
}
long long len1,len2,p[5100],p1[5100],pow[5100],jl[260][5100],ans,k,n,m,st;
char str1[5100],str2[5100],str3[5100];
long long sum[5100]; 
void dfs(long long pos,long long anss)//pos指当前所在位置,ans指完成个数 
{if(pos>n) return;if(anss==m) {ans++;ans%=mod;return;}long long bz=str2[anss+1]-'a';long long l=1,r=jl[bz][0],mid,minn=2<<30-1;while(l<=r){mid=(l+r)/2;if(jl[bz][mid]>=pos) minn=min(minn,mid),r=mid-1;else l=mid+1;}for(long long i=minn;i<=jl[bz][0];i++)if(jl[bz][i]>pos) dfs(jl[bz][i],anss+1);return;
}
int main()
{len1=read(),len2=read(),k=read();scanf("%s%s",str1+1,str2+1);if(k==0) {cout<<0;return 0;}if(k>len2) {cout<<0;return 0;} ans=0;n=len1,m=len2;long long j=0;p[1]=0;for(long long i=1;i){while(j>0&&str2[j+1]!=str2[i+1]) j=p[j];if(str2[j+1]==str2[i+1]) j++;p[i+1]=j;}if(k==1){j=0;for(long long i=0;i){while(j>0&&str2[j+1]!=str1[i+1]) j=p[j];if(str2[j+1]==str1[i+1]) j++;if(j==m) {ans++;ans%=mod;j=p[j];}}cout<mod;return 0;}else if(k==2){for(long long x=1;x<=m-1;x++){long long l1=1,r1=x,l2=x+1,r2=n;j=0;for(long long i=0;i){while(j>0&&str2[j+1]!=str1[i+1]) j=p[j];if(str2[j+1]==str1[i+1]) j++;if(j==x) {long long cnt=0;for(long long k=x+1;k<=m;k++) str3[++cnt]=str2[k];long long j1=0;p1[1]=0;for(long long i1=1;i1){while(j1>0&&str3[j1+1]!=str3[i1+1]) j1=p1[j1];if(str3[j1+1]==str3[i1+1]) j1++;p1[i1+1]=j1;}j1=0;for(long long i1=i+1;i1){while(j1>0&&str3[j1+1]!=str1[i1+1]) j1=p1[j1];if(str3[j1+1]==str1[i1+1]) j1++;if(j1==m-x) {ans++;ans%=mod;j1=p1[j1];}}j=p[j];}}}cout<mod;return 0;}else if(k==m){for(long long i=1;i<=n;i++) jl[str1[i]-'a'][++jl[str1[i]-'a'][0]]=i;dfs(0,0);cout<mod;return 0;}else {cout<<283;return 0;}
}
/*
6 3 3
aabaab
aab
*/
考试时候的代码

好了

现在开始搞正解

dp[i][j][p][z]表示现在到str1的i,str2的j,已经有了p个子串,是否有,拿z表示

发现i之与i-1有关,所以就用滚动数组即可

#include
#include
#include
#include
#define mod  1000000007
using namespace std;
inline int read()
{int f=1,ans=0;char c;while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}return f*ans;
}
int dp[201][201][201][3];
int n,m,k;
char str1[1011],str2[1011];
int main()
{n=read(),m=read(),k=read();scanf("%s%s",str1+1,str2+1);dp[0][0][0][0]=dp[1][0][0][0]=1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int p=1;p<=k;p++){if(str1[i]==str2[j]){dp[i%2][j][p][1]=(dp[(i-1)%2][j-1][p][1]%mod+(dp[(i-1)%2][j-1][p-1][1]%mod+dp[(i-1)%2][j-1][p-1][0])%mod)%mod;dp[i%2][j][p][0]=(dp[(i-1)%2][j][p][0]%mod+dp[(i-1)%2][j][p][1]%mod)%mod;}else{dp[i%2][j][p][0]=(dp[(i-1)%2][j][p][0]%mod+dp[(i-1)%2][j][p][1]%mod)%mod;dp[i%2][j][p][1]=0;}}}}cout<<(dp[n%2][m][k][1]+dp[n%2][m][k][0])%mod;
}
View Code

 

烷基计数(待补)

 

转载于:https://www.cnblogs.com/si-rui-yang/p/9714953.html

更多相关:

  • Gym - 102082Ghttps://vjudge.net/problem/2198225/origin对于数列中任意一个数,要么从最左边到它不递减,要么从最右边到到它不递减,为了满足这个条件,就要移动,而移动的最少步数就是逆序对数。所以这个数要么往左移动,要么往右移动,所以两个取最小就好了 #include

  • 雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义: 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 041 bit: 时间差,我们可以选择一个参考点,用它来计算与当前时间的时间差 (毫秒数),41 bit 存储时间差,足够使用 69 年10 bit: 机器码,能编...

  • 题目链接:http://codeforces.com/problemset/problem/900/D 题意:   给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y。   题解:   由于gcd(a[i]) = x,所以y一定是x的倍数,否则无解。   那么原题就等价于:问你有多少个数列a满足g...

  • P2429 制杖题 题目描述 求不大于 m 的、 质因数集与给定质数集有交集的自然数之和。 输入输出格式 输入格式:第一行二个整数 n,m。 第二行 n 个整数,表示质数集内的元素 p[i]。 输出格式:一个整数,表示答案,对 376544743 取模。 输入输出样例 输入样例#1:2 15 3 5 输出样例#1:60 说...

  • 题目:正则表达式匹配 请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。 示例 1:...

  • 题意:就是在n*m的格子中放“炮”(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状压,但数据范围有100),这篇博客些的很好(传送门),我们定义dp[i][j][k]代表前i行我们有j列式有2个棋子,有k列是一个棋子,那么我们空的列的个数...

  • 虽然也是一道dp的入门题,但就是想不到,或者说不会实现。dp还是要多做题。 链接:https://www.luogu.org/problemnew/show/P1164   我们可以设dp[i][j]表示以考虑完第i件,恰好消费j元的方案数。那么dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]],也就是讨论第i件点...

  • bzoj1260,懒得复制,戳我戳我 Solution: 这种题目我不会做qwq,太菜了区间打牌(dp) 用f[l][r]表示从l到r最少需要染几次色。状态转移方程: 1.(f[l][r]=min(f[l][i],f[i+1][r]) (l<=i

  • 题目背景 博弈正在机房颓一个叫做《模拟城市2.0》的游戏。 2048年,经过不懈努力,博弈终于被组织委以重任,成为D市市委书记!他勤学好问,励精图治,很快把D市建设成富强民主文明和谐的美好城市。为了进一步深化发展,他决定在海边建立一个经济开发区。 题目描述 已知开发区的建筑地块是一个n×nn imes nn×n的矩形,而开发...

  • #include #include #include #include #include #include #include

  • 题目:表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。 解题: 数值错误的形式有多种多样,但是正确的...

  • 加法伺候  //超过20位数值相加---------------------------------------- function bigNumAdd(a, b) {if (!(typeof a === "string" && typeof b === "string")) return console.log("传入参数必...

  • 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程...

  • 简单record 一下 #include // 'struct sockaddr_in' #include #include // 'struct ifreq' and 'struct if_nameindex' #include #inc...