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])
代码:
思路:
设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); } } }
相关文章推荐
- HDU - 6146 Pokémon GO(表格dp)
- HDU 6146 Pokémon GO (dp)
- hdu 6146 Pokémon GO(DP)
- HDU 6146 && 2017 百度之星复赛 1003 Pokémon GO(递推)
- HDU 6146 Pokémon GO DP,计数
- HDU 6146 Pokémon GO(dp+组合数学)
- HDU 6146:Pokémon GO
- HDU6146(2017百度之星程序设计大赛 - 复赛)[Pokémon GO]--DP
- HDU 6147 Pokémon GO II(计算几何)
- 百度之星复赛--Pokémon GO----dp
- HDU-2017"百度之星"程序设计大赛-复赛-1003-Pokémon GO
- HDU6146 Pokémon GO【DP】
- 2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pokémon GO【数学,递推,dp】
- 【HDU6146】【2017百度之星复赛-C】Pokémon GO(动态规划)(dp)
- 【HDU-6146】Pokémon GO(dp)
- HDU 1423 Greatest Common Increasing Subsequence(DP)
- HDU_1058 && HDU_3199(指针 + dp)
- hdu 4284 Travel(壮压DP&TSP&floyd)
- hdu1176 dp
- hdu 1565 方格取数(1)(状态压缩DP)