bzoj1556 (DP)
2024-09-08 14:13:10
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 ;
}
最新文章
- jQuery之回调对象
- SL410K 在Ubuntu禁用触摸板
- java出现no XXX in java.library.path的解决办法及eclipse配置
- Linux parted 分区
- 安装grid之前检查配置 ,报错如下
- Java创建线程的细节分析
- java IO流文件的读写具体实例
- 算法模板——AC自动机
- git分支的使用
- idea如何添加外部jar包
- Lua语法要点
- POJ-1287 Networking---裸的不能再裸的MST
- MYSQL 更新时间自动同步与创建时间默认值共存问题
- 【DFS】素数环问题
- 各类排序算法的实现C#版
- 实时监听 input值的变化
- git merge branch
- jquery 判断checkbox是否被选中问题
- 常用DB2命令
- iOS LaunchScreen设置启动图片 启动页停留时间
热门文章
- GCD CoreData 简化CoreData操作(转)
- ArcGIS for Android地图控件的5大常见操作转
- .Net ToString Format [转]
- [MFC]选择目录对话框和选择文件对话框 [转]
- elasticsearch 查询模板
- d3js 画布 概念
- Python之Pandas库常用函数大全(含注释)
- EF架构~终于自己架构了一个相对完整的EF方案
- Nginx+ffmpeg的HLS开源server搭建配置及开发具体解释
- MySQL 创建自定义函数(1)