您的位置:首页 > 其它

dp问题总结

2016-03-13 00:06 776 查看
从今天开始,每次的dp问题都码在这里

1. 国王的游戏

题目如下:

http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=677&pid=1003

这道题是一道典型的dp问题,采用递推的方式解决。首先初始化数组dp的前几项为dp = {0,26,676,17576,456950},以下是这道题的思路:

dp[i]是在dp[i-1]上增加了最后一个字符,有26种情况,但是有不符合要求的要减掉。不符合要求的情况就是第i i-1 i-2 i-3个字符都相同,同时和第i-4个字符不同。所以,不符合要求的情况为dp[i-4]*25种。

综上:dp[i]=dp[i-1]*26-dp[i-4]*25

本来这道题就是这样,但是涉及到取模的问题。列出几条取模的性质:

(a + b) % p = (a % p + b % p) % p (1)

(a - b) % p = (a % p - b % p) % p (2)

(a * b) % p = (a % p * b % p) % p (3)

(a^b) % p = ((a % p)^b) % p (4)

所以应用到本题种,变成dp[i]=((dp[i-1]*26-dp[i-4]*25)%M+M)%M

其中M=1000000007

代码如下:

/[b]***************************************************************[/b]

File Name: 1003.cpp

Author: wxc575843

Mail: wxc575843@163.com

Created Time: 六 3/12 20:28:49 2016

[b]**************************************************************[/b]/

#include<iostream>
using namespace std;

int M=1000000007;
long long int dp[2001]={0,26,676,17576,456950};

void init(){
for(int i=5;i<2001;i++){
dp[i]=((dp[i-1]*26-dp[i-4]*25)%M+M)%M;
}
}

void solve(){
int len;
cin >> len;
cout<<dp[len]<<endl;
}

int main(){
int n;
init();
cin>>n;
while(n--){
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: