您的位置:首页 > 编程语言 > Go语言

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

2017-08-20 10:52 369 查看

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。

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

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

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

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

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

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#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<<dp
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: