SRM 594 DIV1 250

可能开始宿舍比较乱,思绪静不下来。。。想了大半个小时,终于确定了应该暴力+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 };

 

posted @ 2013-10-16 11:19  Naix_x  阅读(329)  评论(0编辑  收藏  举报