bzoj 1556 点这里打开题目

题目是求 a^2 求和;

原问题可以转化为:两个人在玩这个东西,问这两个人弄出来的序列相同的有多少种情况,操作方式不同即为一种不同的情况。

就这个问题,参考大佬的DP思想。

DP[t][i][j] 分别表示 两人同时第t次取小球,第一人在上面管道取了i个,第二个人在上面管道取了j个所出现相同情况的个数:

我们假设:某一个状态为  DP[t][i][j] 。当第一人取得球和第二个人取得球颜色相同时,那么下一个状态就可以从当前状态转过去;

所以很容易得到状态转移为:每个人都可以取上面和下面的;组合一样四个情况,判断球颜色是否一样:转移。

注意:自己写的时候看清下标。

This is code

#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stdlib.h>
#include <stdio.h> using namespace std;
typedef long long int LL;
const int maxn=;
char a[maxn],b[maxn];
int dp[][maxn][maxn];
const int MOD=;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
scanf("%s%s",a,b);
dp[][][]=;
for(int t=;t<n+m;t++)
{
int gd=t%;
for(int i=;i<=n&&i<=t;i++)
for(int j=;j<=n&&j<=t;j++)
{
if(t-i>m||t-j>m) continue;
if(a[i]==a[j]) (dp[!gd][i+][j+]+=dp[gd][i][j])%=MOD;
if(a[i]==b[t-j]) (dp[!gd][i+][j]+=dp[gd][i][j])%=MOD;
if(b[t-i]==a[j]) (dp[!gd][i][j+]+=dp[gd][i][j])%=MOD;
if(b[t-i]==b[t-j]) (dp[!gd][i][j]+=dp[gd][i][j])%=MOD;
dp[gd][i][j]=;
}
}
printf("%d\n",dp[(m+n)%][n][n]);
return ;
}
												

最新文章

  1. jQuery之回调对象
  2. SL410K 在Ubuntu禁用触摸板
  3. java出现no XXX in java.library.path的解决办法及eclipse配置
  4. Linux parted 分区
  5. 安装grid之前检查配置 ,报错如下
  6. Java创建线程的细节分析
  7. java IO流文件的读写具体实例
  8. 算法模板——AC自动机
  9. git分支的使用
  10. idea如何添加外部jar包
  11. Lua语法要点
  12. POJ-1287 Networking---裸的不能再裸的MST
  13. MYSQL 更新时间自动同步与创建时间默认值共存问题
  14. 【DFS】素数环问题
  15. 各类排序算法的实现C#版
  16. 实时监听 input值的变化
  17. git merge branch
  18. jquery 判断checkbox是否被选中问题
  19. 常用DB2命令
  20. iOS LaunchScreen设置启动图片 启动页停留时间

热门文章

  1. GCD CoreData 简化CoreData操作(转)
  2. ArcGIS for Android地图控件的5大常见操作转
  3. .Net ToString Format [转]
  4. [MFC]选择目录对话框和选择文件对话框 [转]
  5. elasticsearch 查询模板
  6. d3js 画布 概念
  7. Python之Pandas库常用函数大全(含注释)
  8. EF架构~终于自己架构了一个相对完整的EF方案
  9. Nginx+ffmpeg的HLS开源server搭建配置及开发具体解释
  10. MySQL 创建自定义函数(1)