poj-3791-An Easy Game-记忆化搜索

dp[i][j]:还有i个不同样的位置,还能走j步,一共同拥有多少种走法。

非常明显

dp[i][j]=sigm(dp[i-k][j-1]*c[i][k]*c[n-i][m-k]);

用记忆化搜索记忆一下就可以。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<stack>
using namespace std;
#define maxn 110
#define LL long long
#define mod 1000000009
LL dp[maxn][maxn];
LL c[maxn][maxn];
void init()
{
    c[0][0]=1;
    c[1][0]=1;
    c[1][1]=1;
    for(int i=2;i<maxn;i++)
    {
        c[i][0]=1;
        for(int j=1;j<=i;j++)
        {
            c[i][j]=c[i-1][j-1]+c[i-1][j];
            c[i][j]=c[i][j]%mod;
        }
    }
}
int n,m,k;
LL dfs(int s,int t,int p)
{
   // cout<<s<<" "<<t<<" "<<p<<endl;
    if(dp[s][p]!=-1)return dp[s][p];
    if(p==0)
    {
        dp[s][p]=(s==0);
       // printf("dp[%d][%d]===%lld\n",s,p,dp[s][p]);
        return dp[s][p];
    }
    dp[s][p]=0;
    for(int i=0;i<=k;i++)
    {
        if(s<i)continue;
        if(t<k-i)continue;
        dp[s][p]+=(c[s][i]*c[t][k-i])%mod*dfs(s-i+(k-i),t+i-(k-i),p-1)%mod;
        dp[s][p]=dp[s][p]%mod;
    }
//    printf("dp[%d][%d]=%lld\n",s,p,dp[s][p]);
    return dp[s][p];
}
int main()
{
    char str[110];
    char str2[110];
    init();
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        memset(dp,-1,sizeof(dp));
        scanf("%s",str);
        scanf("%s",str2);
        int s=0;
        for(int i=0;i<n;i++)
        {
            if(str[i]!=str2[i])s++;
        }
        printf("%lld\n",dfs(s,n-s,m));
    }
    return 0;
}
时间: 2024-11-09 23:47:13

poj-3791-An Easy Game-记忆化搜索的相关文章

poj 1579(动态规划初探之记忆化搜索)

Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17843   Accepted: 9112 Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b

POJ 1351 Number of Locks (记忆化搜索 状态压缩)

Number of Locks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1161   Accepted: 571 Description In certain factory a kind of spring locks is manufactured. There are n slots (1 < n < 17, n is a natural number.) for each lock. The height

POJ 3249 Test for Job (记忆化搜索 好题)

Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9512   Accepted: 2178 Description Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon as possible. Nowadays, It's hard to have a job

poj 1661 Help Jimmy(记忆化搜索)

题目链接:http://poj.org/problem?id=1661 一道还可以的记忆化搜索题,主要是要想到如何设dp,记忆化搜索是避免递归过程中的重复求值,所以要得到dp必须知道如何递归 由于这是个可以左右移动的所以递归过程肯定设计左右所以dp的一维为从左边下或者从右边下,而且和层数有关所以另一维为层数 于是便可以得到dp[count][flag],flag=1表示count层从左边下要多久,flag=0表示count层从右边下要多久.然后就是dfs的递归 过程 #include <iost

POJ 1579 Function Run Fun 记忆化搜索

Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 1 if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: w(20, 20, 20) if a &

POJ 1351-Number of Locks(记忆化搜索)

Number of Locks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1140   Accepted: 559 Description In certain factory a kind of spring locks is manufactured. There are n slots (1 < n < 17, n is a natural number.) for each lock. The height

poj 1088 动态规划+dfs(记忆化搜索)

滑雪 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个 区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6

POJ 2192 &amp;&amp; HDU 1501 Zipper (记忆化搜索)

Zipper Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16803   Accepted: 5994 Description Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first tw

POJ 1088 滑雪 (DPor记忆化搜索)

题目大意:中文题:http://poj.org/problem?id=1088 先上一发自己写的记忆化,渣,900多毫秒 #include <iostream> #include <cstdio> #include <stack> #include <cstring> using namespace std; int a[111][111]; int visit[111][111]; int dp[111][111]; int dir[4][2] = {{1

POJ 1579-Function Run Fun(记忆化搜索)

Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16503   Accepted: 8514 Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b