POJ 3036 Honeycomb Walk
2017-04-21 20:52
337 查看
http://poj.org/problem?id=3036
在每一个格子可以转移到与这个各自相邻的六个格子
那么设置转移变量 只需要六个 int d[6][2] = {-1, 0, -1, 1, 0, 1, 1, 0, 1, -1, 0, -1};
然后设dp[i][j][k] : 第i步走到(j ,k) 的方式数
那么转移方程:
for (int m = 0; m < 6; m++)
dp[i][j][k] += dp[i-1][j+d[m][0]][k+d[m][1]]
三个维度的状态 最后得到dp
[O][O] 就是最后回到原点的个数 六边形只需要坐标六个变化
因为最多n = 14
最多上下最多可以走14 / 2 = 7个
所以设置(7 , 7) 为原点
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define INF 0x3fffffff 5 using namespace std; 6 7 8 long long dp[16][32][32]; 9 int d[6][2] = {-1, 0, -1, 1, 0, 1, 1, 0, 1, -1, 0, -1}; //开始坐标标错了 10 int dx[]={1,0,1,-1,0,-1}; 11 int dy[]={0,1,1,0,-1,-1}; 12 int main() 13 { 14 memset(dp, 0, sizeof(dp)); 15 dp[0][7][7] = 1; 16 for (int i = 1; i <= 14; i++) 17 for(int j = 0; j <= 14; j++) 18 for(int k = 0; k <= 14; k++) 19 for(int m = 0; m < 6; m++) 20 dp[i][j][k] += dp[i-1][j+d[m][0]][k+d[m][1]]; 21 int T; 22 cin >> T; 23 while (T--) 24 { 25 int n; 26 cin >> n; 27 cout << dp [7][7] << endl; 28 } 29 return 0; 30 }
相关文章推荐
- poj 3036 Honeycomb Walk 暴力枚举 dp
- POJ-3036 Honeycomb Walk 简单DP
- POJ 3036 Honeycomb Walk(DP)
- poj[3093]Margaritas On River Walk
- POJ 3093 Margaritas on the River Walk
- 2489. Honeycomb Walk
- poj 2662 A Walk Through the Forest
- POJ 3043 Walk the Talk 笔记
- POJ&&HDU A Walk Through the Forest
- POJ-2662-A Walk Through the Forest;UVA-10917 - Walk Through the Forest(最短路径)
- POJ - 3039 MARGARITAS ON THE RIVER WALK
- POJ 3093 Margaritas on the River Walk 0-1背包好题
- zoj 2546 || poj 2662 || hdu 1142 A Walk Through the Forest
- poj - 3039 Margaritas on the River Walk
- HDU 2323 Honeycomb Walk
- poj 2662 A Walk Through the Forest
- POJ 3093 Margaritas on the River Walk 0-1背包好题
- poj 3036
- poj 3093 Margaritas on the River Walk(01背包统计)
- POJ 3995 Hop — Don’t Walk! 已被翻译