SRM 562 DIV2
2012-12-01 15:24
281 查看
1、第一个,水题,直接求最大值即可,略。
2、根据题目,clipboard最大的时候是50,则可以得到,当粘贴超过50次以后,每次增长的个数是肯定是固定个数。
写的时候为了保险,把50换到了100多。
3、动态规划+状态压缩的问题。
2、根据题目,clipboard最大的时候是50,则可以得到,当粘贴超过50次以后,每次增长的个数是肯定是固定个数。
写的时候为了保险,把50换到了100多。
#include <iostream> #include <string> #include <vector> #include <cstdlib> #include <map> #include <algorithm> #include <stack> #include <queue> #include <cmath> using namespace std; typedef long long ll; const int sz_pix = 160; int num[sz_pix]; bool judge[sz_pix][sz_pix]; class PastingPaintingDivTwo { public: long long countColors(vector<string> clipboard, int T) { int r = clipboard.size(); int c = clipboard[0].size(); for (int i = 0; i < sz_pix; i++) for (int j = 0; j < sz_pix; j++) { num[i] = 0; judge[i][j] = false; } for (int i = 0; i < 105; i++) { for (int a = 0; a < r; a++) { for (int b = 0; b < c; b++) { if ((!judge[i + a][i + b]) && (clipboard[a][b] == 'B')) { judge[i + a][i + b] = true; num[i]++; } } } } if (T > 103) { ll inc = num[102] ; ll remain = T - 103; ll tmp = remain * inc; ll res = tmp; for (int i = 0; i < 103; i++) { res += num[i]; } return res; } ll res = 0; for (int i = 0; i < T; i++) { res += num[i]; } return res; } };
3、动态规划+状态压缩的问题。
#include <iostream> #include <string> #include <vector> #include <cstdlib> #include <map> #include <algorithm> #include <stack> #include <queue> #include <cmath> using namespace std; typedef long long ll; ll num[15][15][1 << 14]; bool path[15][15]; class RandomOption { public: double getProbability(int keyCount, vector<int> badLane1, vector<int> badLane2) { for (int i = 0; i < keyCount; i++) num[0][i][1 << i] = 1; int sz = badLane1.size(); for (int i = 0; i < sz; i++) { int s = badLane1[i]; int e = badLane2[i]; path[s][e] = path[e][s] = true; } for (int i = 1; i < keyCount; i++) { for (int j = 0; j < keyCount; j++) { for (int pre = 0; pre < (1 << keyCount); pre++) { for (int k = 0; k < keyCount; k++) { if (path[j][k] || (pre & (1 << k))) continue; int now = pre | (1 << k); num[i][k][now] += num[i - 1][j][pre]; }; } } } double all = 1; int keyCount1 = keyCount; while (keyCount1) { all *= keyCount1; keyCount1--; } double pos = 0; for (int i = 0; i < keyCount; i++) { pos += num[keyCount - 1][i][(1 << keyCount) - 1]; } double res = pos / all; return res; } };
相关文章推荐
- topcoder 849-SRM 562 DIV1
- Topcoder SRM 562 DIV2 900 RandomOption
- [TopCoder][SRM] SRM 562 DIV 2
- SRM 562 Div1 500 CheckerFreeness
- [树形DP 杂题] SRM 562 div1 InducedSubgraphs
- TC SRM 562 DIV 2
- TC SRM 562 DIV 2
- SRM 698 div1 RepeatString
- SRM 594 DIV1 250
- SRM 596 DIV2
- topcoder srm 350 div1
- topcoder srm 410 div1
- [TopCoder] SRM_594_DIV2.250
- SRM 597 DIV2 250
- topcoder srm 400 div1
- TC srm 632 div1
- SRM 559 div 2【AK】
- 【TC SRM 718 DIV 2 B】Reconstruct Graph
- 【SRM 717 div2 B】LexmaxReplace
- Topcoder SRM 543 DIV2 1000 EllysThreeRivers & DIV1 500 EllysRivers