博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1566 [NOI2009]管道取珠
阅读量:7115 次
发布时间:2019-06-28

本文共 2171 字,大约阅读时间需要 7 分钟。

题目:

十分巧妙的dp。

关键是思考式子的意义,就能根据意义来推。

本题a[i]^2的意义可以看做是有两个人在排序列,排出来的结果一样的方案。(思路在于“方案 * 方案”的乘法原理)

这是10s+的代码:

#include
#include
#include
#define ll long longusing namespace std;const int N=505;const ll mod=1024523;int n,m;char a[N],b[N];ll dp[2][N][N];int main(){ scanf("%d%d ",&n,&m); cin>>(a+1)>>(b+1); dp[0][0][0]=1; for(int i=1;i<=n+m;i++) { memset(dp[i&1],0,sizeof dp[i&1]); for(int j=max(0,i-m);j<=n&&j<=i;j++) for(int k=max(0,i-m);k<=n&&k<=i;k++) { if(b[m-(i-j)+1]==b[m-(i-k)+1])(dp[i&1][j][k]+=dp[(i-1)&1][j][k])%=mod; if(j&&a[n-j+1]==b[m-(i-k)+1])(dp[i&1][j][k]+=dp[(i-1)&1][j-1][k])%=mod; if(k&&b[m-(i-j)+1]==a[n-k+1])(dp[i&1][j][k]+=dp[(i-1)&1][j][k-1])%=mod; if(j&&k&&a[n-j+1]==a[n-k+1])(dp[i&1][j][k]+=dp[(i-1)&1][j-1][k-1])%=mod;// printf("dp[%d][%d][%d]=%lld\n",i,j,k,dp[i&1][j][k]); } } printf("%lld",dp[(n+m)&1][n][n]); return 0;}
View Code

如果把字符串一开始就翻转,可以变成9s+;把 ( i & 1 ) 和 ( i - j )之类的设个变量代替,可以变成7s+;

把long long改成int,可以变成4s+!

#include
#include
#include
#define ll long longusing namespace std;const int N=505,mod=1024523;int n,m;char a[N],b[N];int dp[2][N][N];int main(){ scanf("%d%d ",&n,&m); cin>>(a+1)>>(b+1); for(int i=1;i<=(n>>1);i++)swap(a[i],a[n-i+1]); for(int i=1;i<=(m>>1);i++)swap(b[i],b[m-i+1]); dp[0][0][0]=1; for(int i=1;i<=n+m;i++) for(int j=max(0,i-m);j<=n&&j<=i;j++) for(int k=max(0,i-m);k<=n&&k<=i;k++) { int x=(i&1),y=!x,u=i-j,v=i-k; dp[x][j][k]=0; if(b[u]==b[v])(dp[x][j][k]+=dp[y][j][k])%=mod; if(j&&a[j]==b[v])(dp[x][j][k]+=dp[y][j-1][k])%=mod; if(k&&b[u]==a[k])(dp[x][j][k]+=dp[y][j][k-1])%=mod; if(j&&k&&a[j]==a[k])(dp[x][j][k]+=dp[y][j-1][k-1])%=mod;// printf("dp[%d][%d][%d]=%lld\n",i,j,k,dp[i&1][j][k]); } printf("%d",dp[(n+m)&1][n][n]); return 0;}

 

转载于:https://www.cnblogs.com/Narh/p/9164272.html

你可能感兴趣的文章
input file上传base编码图片及上传同一张图片
查看>>
爬虫网页解析之css用法及实战爬取中国校花网
查看>>
手拉手教你实现一门编程语言 Enkel, 系列 3
查看>>
JavaScript 复习之 String 对象
查看>>
面试技巧
查看>>
JS 中 'hello' 和 new String('hello') 引出的问题
查看>>
行高与字体的关系
查看>>
Android FragmentManager使用
查看>>
记一次移动端使用 rem 的兼容性问题
查看>>
区块链--共识算法POW
查看>>
JS中常用的8种跨域方式讲解
查看>>
Kotlin DSL 实战
查看>>
权力的游戏 第七季高清 BT 下载
查看>>
区块链开发 HSM技术
查看>>
GitHub排名TOP30的机器学习开源项目
查看>>
(译)使用Spring Boot和Axon实现CQRS&Event Sourcing
查看>>
node+express forever命令总结
查看>>
理解设计模式
查看>>
模型剖析 | 如何解决业务运维的四大难题?
查看>>
iOS弹幕高效加载实现方式
查看>>