uestc 稳住GCD

DP

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstdlib>

 4 #include<cstring>

 5 #include<string>

 6 #include<queue>

 7 #include<algorithm>

 8 #include<map>

 9 #include<iomanip>

10 #include<climits>

11 #include<string.h>

12 #include<cmath>

13 #include<stdlib.h>

14 #include<vector>

15 #define INF 1e7

16 #define MAXN 111111

17 #define Mod 1000007

18 using namespace std;

19 typedef long long LL;

20 

21 int dp[777][10010];

22 int a[777];

23 int n, g, i, j;

24 

25 int gcd(int a, int b)

26 {

27     return b == 0 ? a : gcd(b,a%b);

28 }

29 

30 void init()

31 {

32     g = 0;

33     for (i = 1; i <= n; ++i)

34         for (j = 0; j <= 10004; ++j)

35             dp[i][j] = Mod;

36 }

37 int main()

38 {

39     cin >> n;

40     init();

41     int maxi = 1;

42     for (i = 1; i <= n; ++i) {

43         cin >> a[i];

44         g = gcd(a[i],g);

45         maxi = max(maxi, a[i]);

46         dp[i][a[i]] = 1;

47     }

48     for (i = 2; i <= n; ++i) {

49         for (j = 0; j <= maxi; ++j) {

50             if (dp[i - 1][j] != Mod) {

51                 int gg = gcd(a[i],j);

52                 if (gg == j) 

53                     dp[i][gg] = min(dp[i][gg], dp[i - 1][j]);

54                 else

55                     dp[i][gg] = min(dp[i][gg], dp[i - 1][j] + 1);

56             }

57         }

58     }

59     cout << n - dp[n][g] << endl;

60     return 0;

61 }

 

你可能感兴趣的:(GC)