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 };

 

你可能感兴趣的:(div)