可能开始宿舍比较乱,思绪静不下来。。。想了大半个小时,终于确定了应该暴力+DP,然后写了枚举除数,和被除的版本。。这样,还敲错了个字母,第一次提交还100多,修改提交还有75.多,最后想到,貌似不打对啊,改完再交就剩下75了。。。还好,没挂0。。。这样写,还是比较好写的,最后10分钟,开始改,最后4分钟改完。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 #define LL long long 9 int dp[62][61]; 10 int gcd(int a,int b) 11 { 12 return b == 0?a:gcd(b,a%b); 13 } 14 LL s1[60]; 15 LL s2[60]; 16 int dfs(int n,int m) 17 { 18 int i,j; 19 memset(dp,0,sizeof(dp)); 20 for(i = 1; i <= n; i ++) 21 { 22 for(j = 1; j <= m; j ++) 23 { 24 if(s1[i-1] == s2[j-1]) 25 dp[i][j] = dp[i-1][j-1] + 1; 26 else 27 dp[i][j] = max(dp[i-1][j],dp[i][j-1]); 28 } 29 } 30 return dp[n][m]; 31 } 32 class AstronomicalRecords 33 { 34 public : 35 int minimalPlanets(vector <int> A, vector <int> B) 36 { 37 int i,j,k,maxz; 38 for(i = 0; i < A.size(); i ++) 39 s1[i] = A[i]; 40 for(i = 0; i < B.size(); i ++) 41 s2[i] = B[i]; 42 maxz = dfs(A.size(),B.size()); 43 44 for(i = 0; i < A.size(); i ++) 45 { 46 47 for(j = 0; j < B.size(); j ++) 48 { 49 for(k = 0; k < A.size(); k ++) 50 s1[k] = (LL)B[j]*A[k]; 51 for(k = 0; k < B.size(); k ++) 52 s2[k] = (LL)A[i]*B[k]; 53 maxz = max(maxz,dfs(A.size(),B.size())); 54 } 55 56 } 57 return A.size() + B.size() - maxz; 58 } 59 };