USACO 1.1 Broken Necklace (DP动态规划)
2015-09-09 21:49
351 查看
<pre name="code" class="cpp">#include <stdio.h> #define DEBUG 0 #define TESTCASES 8 #define LEN_NECKLACE 350 #define MAX(a, b) ( (a) > (b) ? (a) : (b) ) int numOfBeads; int numOfDoubleBeads; char necklace[LEN_NECKLACE * 2 + 1]; // beadsCollectedForward[bead][0]表示当断点为bead-1和bead之间时, 从bead开始往前(右)连续收集到红色珠子的数量 // beadsCollectedForward[bead][1]表示当断点为bead-1和bead之间时, 从bead开始往前(右)连续收集到蓝色珠子的数量 int beadsCollectedForward[LEN_NECKLACE * 2 + 1][2]; // beadsCollectedBackward[bead][0]表示当断点为bead和bead+1之间时, 从bead开始往后(左)连续收集到红色珠子的数量 // beadsCollectedBackward[bead][1]表示当断点为bead和bead+1之间时, 从bead开始往后(左)连续收集到蓝色珠子的数量 int beadsCollectedBackward[LEN_NECKLACE * 2 + 1][2]; void strCpy(char *to, char *from){ while (*to = *from){ if (*from == '\0') break; to++; from++; } *to = '\0'; } void strCat(char *before, char *after){ while (*before != '\0') before++; while (*after != '\0'){ *before = *after; before++; after++; } *before = '\0'; } void initialBeadsCollected(int beadsCollected[][2], int bead){ switch (necklace[bead]){ case 'w': beadsCollected[bead][0] = 1; beadsCollected[bead][1] = 1; break; case 'r': beadsCollected[bead][0] = 1; beadsCollected[bead][1] = 0; break; case 'b': beadsCollected[bead][0] = 0; beadsCollected[bead][1] = 1; break; } } void collect(int beadsCollected[][2], int bead, int direction){ switch (necklace[bead]){ case 'w': beadsCollected[bead][0] = beadsCollected[bead - direction][0] + 1; beadsCollected[bead][1] = beadsCollected[bead - direction][1] + 1; break; case 'r': beadsCollected[bead][0] = beadsCollected[bead - direction][0] + 1; beadsCollected[bead][1] = 0; break; case 'b': beadsCollected[bead][0] = 0; beadsCollected[bead][1] = beadsCollected[bead - direction][1] + 1; break; } } int main(){ #if DEBUG int testCase; for (testCase = 1; testCase <= TESTCASES; testCase++){ char inputFileName[20] = "necklace.inX"; inputFileName[11] = '1' + (testCase - 1); freopen(inputFileName, "r", stdin); printf("#%d\n", testCase); #endif scanf("%d %s", &numOfBeads, necklace); //两条链子相连当成环处理 numOfDoubleBeads = numOfBeads * 2; char temp[LEN_NECKLACE * 2 + 1]; strCpy(temp, necklace); strCat(necklace, temp); int bead = 0; initialBeadsCollected(beadsCollectedBackward, bead); for (bead++; bead < numOfDoubleBeads; bead++) collect(beadsCollectedBackward, bead, 1); bead = numOfDoubleBeads - 1; initialBeadsCollected(beadsCollectedForward, bead); for (bead--; bead >= 0; bead--) collect(beadsCollectedForward, bead, -1); int maxBeadsCollected = 0; int lastBead = numOfDoubleBeads - 1; //注意边界,断点在bead和bead+1之间,从bead开始往后(左)收集,从bead+1开始往前(右)收集 for (bead = 0; bead < lastBead; bead++){ int beadsCollected = MAX(beadsCollectedBackward[bead][0], beadsCollectedBackward[bead ][1]) + MAX(beadsCollectedForward[bead + 1][0], beadsCollectedForward[bead + 1][1]); if (beadsCollected > maxBeadsCollected) maxBeadsCollected = beadsCollected; } printf("%d\n", maxBeadsCollected > numOfBeads ? numOfBeads : maxBeadsCollected); #if DEBUG } #endif return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- php提示Failed to write session data错误的解决方法
- PHP5.5和之前的版本empty函数的不同之处
- PHP has encountered a Stack overflow问题解决方法
- php 生成WML页面方法详解
- PHP过滤★等特殊符号的正则
- php中文字母数字验证码实现代码
- C#使用动态规划解决0-1背包问题实例分析
- Pear DB 新手入门指南教程第1/3页
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- 解析php中heredoc的使用方法
- php中运用http调用的GET和POST方法示例
- LFC1.0.0 版本发布
- 动态规划
- C++ 动态规划
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- DP(动态规划) 解游轮费用问题