A 整理字符串

1 class Solution { 2 public: 3 string makeGood(string s) { 4 stack<char> v; 5 int n = s.size(); 6 for (int i = 0; i < n; i++) { 7 char c1 = s[i]; 8 if (v.size()) { 9 char c2 = v.top(); 10 if (abs(c1 - c2) == 32) v.pop(); 11 else v.push(c1); 12 } else { 13 v.push(c1); 14 } 15 } 16 s = ""; 17 while (v.size()) { 18 char c = v.top(); 19 v.pop(); 20 s = s + c; 21 } 22 reverse(s.begin(), s.end()); 23 return s; 24 } 25 };

1 class Solution { 2 public: 3 char findKthBit(int n, int k) { 4 string s[30]; 5 s[1] = "0"; 6 for (int i = 2; i <= n; i++) { 7 string p = s[i - 1]; 8 for (int j = 0; j < p.size(); j++) { 9 if (p[j] == '0') p[j] = '1'; 10 else p[j] = '0'; 11 } 12 reverse(p.begin(), p.end()); 13 s[i] = s[i - 1] + "1" + p; 14 } 15 return s[n][k - 1]; 16 } 17 };
前缀和,贪心,用map标记一下前缀和,得到target,清空下map,记得每次更新都要把map[0] = 1,不然会缺少情况。

1 class Solution { 2 public: 3 int maxNonOverlapping(vector<int>& nums, int target) { 4 int n = nums.size(); 5 map<int, int> m; 6 int ans = 0, sum = 0; 7 m[0] = 1; 8 for (int i = 0; i < n; i++) { 9 sum += nums[i]; 10 if (m[sum - target]) { 11 ans++; 12 m.clear(); 13 m[0] = 1; 14 sum = 0; 15 } else { 16 m[sum] = 1; 17 } 18 } 19 return ans; 20 } 21 };
D 切棍子的最小成本
很典型的区间DP,一开始没想到...,还以为是个贪心。
动态转移方程:$dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + cost[i][j])$,$dp[i][j]$表示从第i个切割点到第j个切割点之间的最少代价,枚举分割点i和j之间所有的切割点k,寻找最优值。

1 class Solution { 2 public: 3 int minCost(int n, vector<int>& cuts) { 4 cuts.push_back(0); 5 cuts.push_back(n); 6 int m = cuts.size(); 7 vector< vector<int> > dp(m, vector<int>(m, 0x3f3f3f3f)); 8 sort(cuts.begin(), cuts.end()); 9 dp[0][0] = 0; 10 for (int i = 1; i < m; ++i){ 11 dp[i][i] = 0; 12 dp[i - 1][i] = 0; 13 } 14 for (int i = m - 2; i >= 0; i--){ 15 for (int j = i + 1; j < m; j++){ 16 for (int k = i + 1; k < j; k++){ 17 int cost = cuts[j] - cuts[i]; 18 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + cost); 19 } 20 } 21 } 22 return dp[0][m-1]; 23 } 24 };