Pokémon GO
Accepts: 738
Submissions: 1725
Time Limit: 3000/1500 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=777&pid=1003
这是一个普通的dp。
一个可行的思路是考虑三个子问题
-
全部走完2*N个格子的方法总数DP[N]
-
全部走完2*N个格子并且起点是最左边的两个格子之一的方法总数DP2[N]
-
全部走完2*N个格子并且起点和终点分别是最左边的两个格子的方法总数DP3[N]
组合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[n]<<endl;
}
return 0;
}