Problem A. Square Counting
数由格点组成的所有正方形个数, 正方形的边可以不和坐标轴平行。
对于每个由个点组成的正方形,存在一个最小的格点正方形,这个正方形的边平行于坐标轴。
考虑边长为k的平行于坐标轴的格点正方形,它正好是k个正方形的最小外接正方形。因此总的正方形个数是sum[(r-k)*(c-k)*k], 1 <= k <= min(r, c)
Problem B. Patterns Overlap
因为*代表0个或者最多4个字符,将*展开成”****“,每个*匹配0个或者1个字符。然后动态规划判断两个pattern是否可以相同。
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 6 7 void solve() { 8 string t1, t2, s2, s1; 9 cin >> t1 >> t2; 10 for (auto c : t1) { 11 if (c == ‘*‘) s1 = s1 + "****"; else s1 = s1 + c; 12 } 13 14 for (auto c: t2) { 15 if (c == ‘*‘) s2 = s2 + "****"; else s2 = s2 + c; 16 } 17 int n = s1.size(); 18 int m = s2.size(); 19 vector<vector<int>> f(n+1, vector<int>(m+1)); 20 f[0][0] = 1; 21 for (int i = 0; i <= n; i++) { 22 for (int j = 0; j <= m; j++) { 23 if (i > 0 && j > 0) { 24 f[i][j] = f[i-1][j-1] && (s1[i-1] == s2[j-1] || s1[i-1] == ‘*‘ || s2[j-1] == ‘*‘); 25 if (s1[i-1] == ‘*‘) f[i][j] = f[i][j] || f[i-1][j]; 26 if (s2[j-1] == ‘*‘) f[i][j] = f[i][j] || f[i][j-1]; 27 } else if (i == 0 && j != 0) { 28 if (s2[j-1] == ‘*‘) { 29 f[i][j] = f[i][j-1]; 30 } 31 } else if (i != 0 && j == 0) { 32 if (s1[i-1] == ‘*‘) { 33 f[i][j] = f[i-1][j]; 34 } 35 } 36 } 37 } 38 39 if (f[n][m]) cout <<"TRUE"; else cout <<"FALSE"; 40 } 41 42 int main() 43 { 44 int cases; 45 std::ios::sync_with_stdio(false); 46 cin >> cases; 47 for (int i = 1; i <= cases; i++) { 48 cout <<"Case #" << i << ": "; 49 solve(); 50 cout << endl; 51 } 52 return 0; 53 }
Problem C. Space Cubes
这题爆0了。。
可以考虑二维平面的状态。两个正方形框要分别cover(左上,右下)或者(左下,右上),此时二分正方形框的边长,总的时间复杂度是O(nlog(n))
在三维的状态下,应当有左右,上下,前后可以组合,共有四种状态要cover。依然二分正方形框的边长,时间复杂度O(nlog(n))
这题我只考虑了八种里的四种,可能是爆0的原因。
原文:http://www.cnblogs.com/zeeroo32/p/6507074.html