程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> zoj3791(An Easy Game) DP

zoj3791(An Easy Game) DP

編輯:C++入門知識

題意:給出兩個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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//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; im)
            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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved