百度之星复赛--Pokémon GO----dp

Pokémon GO

Accepts: 738
Submissions: 1725
Time Limit: 3000/1500 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description

众所周知,度度熊最近沉迷于 Pokémon GO。

今天它决定要抓住所有的精灵球!

为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都有一个精灵球。度度熊可以选择任意一个格子开始游戏,抓捕格子上的精灵球,然后移动到一个相邻的至少有一个公共点的格子上继续抓捕。例如,(2, 2) 的相邻格子有(1, 1), (2, 1) 和 (1, 2) 等等。

现在度度熊希望知道将所有精灵球都抓到并且步数最少的方案数目。两个方案被认为是不同,当且仅当两个方案至少有一步所在的格子是不同的。

Input

第一行为T,表示输入数据组数。

每组数据包含一个数N。

●1≤T≤100

●1≤N≤10000

Output

对每组数据输出方案数目,结果对 1 000 000 007 取模。

Sample Input
Copy
3
1
2
3
Sample Output
Copy
2
24
96

题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=777&pid=1003


这是一个普通的dp。

一个可行的思路是考虑三个子问题

  1. 全部走完2*N个格子的方法总数DP[N]

  2. 全部走完2*N个格子并且起点是最左边的两个格子之一的方法总数DP2[N]

  3. 全部走完2*N个格子并且起点和终点分别是最左边的两个格子的方法总数DP3[N]

组合2和3的答案就可以得到1 了。

代码:

#include 
#include 
#include 
#define LL long long
using namespace std;
const int mod=1e9+7;
LL dp[10001];
int main(){
    dp[1]=2;
    dp[2]=24;
    dp[3]=96;
    dp[4]=416;
    LL ll=6,rr=14,sum=2*2*2*2,cnt=26;
    for(int i=5;i<=10000;i++){
        LL ti=rr;
        rr+=ll+2;
        ll=ti;
        rr%=mod;
        sum=sum*2%mod;
        cnt+=rr;
        cnt%=mod;
        dp[i]=sum*cnt%mod;
    }
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        cout<


你可能感兴趣的:(ACM_比赛,ACM_各种DP)