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

HDU 6146 Pokémon GO(dp)

2017-08-20 20:24 417 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6146

思路:

设b[i]代表从某个角出发走遍所有格子回到同一列的方案数目

b[i] = b[i-1]*2 = 2^(n-1)

设a[i]代表从某个角出发走遍所有格子的方案数目

a[i] = b[i] + 2*a[i-1] + 4*a[i-2]

所以对于第i列,总数为4*(2*b[i-1]*a[n-i] + 2*b[n-i]*a[i-1])

代码:

#include<bits/stdc++.h>
using namespace std;

const int MOD = 1e9+7;
const int N = 10005;

long long a
,b
;
void Init()
{
b[1] = 1;
a[1] = 1;
a[2] = 6;
for(int i = 2;i < N;i++)
b[i] = b[i-1]*2%MOD;
for(int i = 3;i < N;i++)
a[i] = (2*a[i-1] + b[i] + 4*a[i-2])%MOD;
}
int main()
{
Init();
int n;

while(~scanf("%d",&n)){
if(n == 1)
printf("2\n");
else
{
long long sum = a
*4;
for(int i = 2;i < n;i++)
sum = (sum + 4*(2*b[i-1]*a[n-i]%MOD + 2*b[n-i]*a[i-1]%MOD)%MOD )%MOD;
printf("%lld\n",sum);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: