zoj3791(An Easy Game) DP

题意:给出两个01字符串s1,s2.每次改变s1上m个位置的字符。问k步之后使得s1变为s2的方法有多少种。

解法:DP,关键是状态的设计。考虑还是唯一性和可传递性。dp[i][j]表示第i步后有j个不同到目标的走法数。记忆化搜索dp[0][dif](dif表示初始时不同字符的个数)。转移时候枚举选择情况即可。

代码:

/******************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
const double pi=acos(-1.0);
typedef long long LL;
const int Max=110;
const int INF=1000000009;

int n,k,m;
string s1,s2;
LL C[Max][Max];
int init()
{
    for(int i=0; i<Max; i++)
        for(int j=0; j<=i; j++)
            C[i][j]=j?(C[i-1][j-1]+C[i-1][j])%INF:1;
}
LL dp[Max][Max];
int dif;
LL dfs(int step,int num)
{
    if(dp[step][num]!=-1)
        return dp[step][num];
    LL ans=0;
    for(int i=0; i<=num; i++)
    {
        if(i+n-num<m)
            continue;
        if(i>m)
            break;
      ans=(ans+(C[num][i]*C[n-num][m-i])%INF*dfs(step+1,num-i+m-i))%INF;
    }
    return dp[step][num]=ans;
}
int main()
{
    init();
    while(scanf("%d%d%d",&n,&k,&m)==3)
    {
        dif=0;
        memset(dp,-1,sizeof dp);
        cin>>s1>>s2;
        for(int i=0; i<n; i++)
            if(s1[i]!=s2[i])
                dif++;
        dp[k][0]=1;
        for(int i=1;i<=n;i++)
            dp[k][i]=0;
        cout<<dfs(0,dif)<<'\n';
    }
    return 0;
}

zoj3791(An Easy Game) DP

时间: 2024-10-06 16:16:36

zoj3791(An Easy Game) DP的相关文章

HDU 4359 Easy Tree DP?

Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1487    Accepted Submission(s): 567 Problem Description A Bear tree is a binary tree with such properties : each node has a value o

zoj 3791 An Easy Game dp

An Easy Game Time Limit: 2 Seconds      Memory Limit: 65536 KB One day, Edward and Flandre play a game. Flandre will show two 01-strings s1 and s2, the lengths of two strings are n. Then, Edward must move exact k steps. In each step, Edward should ch

HDU 4359——Easy Tree DP?——————【dp+组合计数】

Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1460    Accepted Submission(s): 557 Problem Description A Bear tree is a binary tree with such properties : each node has a value o

ZOJ 3791 An easy game DP+组合数

给定两个01序列,每次操作可以任意改变其中的m个数字 0变 1  1 变 0,正好要变化k次,问有多少种变法 dp模型为dp[i][j],表示进行到第i次变化,A,B序列有j个不同的 变法总和. 循环k次,每次针对m,向那j个不同 分1-j个即可,不过要用到组合数,因为对每个数操作不同都不一样 最后结果就是 dp[k][0] #include <iostream> #include <cstdio> #include <cstring> #include <alg

ZOJ3791 An Easy Game(DP)

给两个长n的01串s1和s2,要对s1进行k次修改,每次修改m个不同位置,问有几种方式修改成s2. 想偏了,只想到原始的01数值是不重要的,因为每个位置修改次数的奇偶性是确定的这一层.. 其实,这题只要关心从起点到终点有几个位置是不同的,一个数值足矣. 然后具体的状态就是:dp[i][j]表示,进行i次修改后有j个位置不同的方案数. 转移用我为人人,dp[i][j]通过选择修改a个位置不同.m-a个位置相同转移到dp[i+1][j-(a-(m-a))],即dp[i+1][j-(a-(m-a))]

bzoj 3450 Tyvj1952 Easy (概率dp)

3450: Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,comb就是极大的连续o.比如ooxxxxooooxxx,分数就是2*2+4*4=4+16=20.Sevenkplus闲的慌就看他打了一盘,有些地方跟运气无关要么是o要么是x,有些地方o或者x各有50%的可能性,用?号来表示.比如oo?

CF1096D Easy Problem [dp]

CF1096D Easy Problem 复习了几乎忘光了的dp dp数组是这样子的:\(dp[i][0/1/2/3/4]\)表示前\(i\)个字符,"hard"遍历到了第几个字符的最小代价. 核心代码是这样的: memset(dp, 0x3f, sizeof dp); for(int i = 1; i <= 4; i++) dp[0][i] = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= 4; j++)

12170 - Easy Climb(DP+单调队列)

该题需要用数据结构来优化DP ,具体方法就是之前第八章讲的(用数据结构优化算法,紫书P241),使用一个数组和两个指针维护一个单调队列, 可以在O(n)的时间内求出滑动窗口中的最小值 . 有了这个优化我们就可以快速的求出dp[i-1][j](x-d<=j<=x+d)的最小值. 然而刘汝佳就是不这么做,他只用了一个指针,连维护优先队列的数组都没开,就"隐式的"求出了最小值 . 具体做法是: 1.先维护窗口左边界,别让指针k超出了窗口,如果x[k] < x[j] - d那

【BZOJ3450】Tyvj1952 Easy 期望DP

[BZOJ3450]Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,comb就是极大的连续o.比如ooxxxxooooxxx,分数就是2*2+4*4=4+16=20.Sevenkplus闲的慌就看他打了一盘,有些地方跟运气无关要么是o要么是x,有些地方o或者x各有50%的可能性,用?号来表示.比