2020百度之星初赛一 C Dec(DP)

Problem Description
初始有 a, ba,b 两个正整数,每次可以从中选一个大于 1 的数减 1,最后两个都会减到 1,我们想知道在过程中两个数互质的次数最多是多少。

Input
第一行一个正整数 test(1 \le test \le 1000000)test(1≤test≤1000000) 表示数据组数。

接下来 test 行,每行两个正整数 a, b(1 \le a, b \le 1000)a,b(1≤a,b≤1000)。

Output
对于每组数据,一行一个整数表示答案。

Sample Input
1
2 3
Sample Output
4

样例解释
2 3 -> 1 3 -> 1 2 -> 1 1

思路:
不知道为什么sb了去写贪心
直接dp乱搞

#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int maxn = 1e3 + 7;

int dp[maxn][maxn];

int gcd(int x,int y) {
    return y == 0 ? x : gcd(y,x % y);
}

void init() {
    for(int i = 1;i <= 1000;i++) {
        for(int j = 1;j <= 1000;j++) {
            int num1 = dp[i - 1][j] + (gcd(i,j) == 1);
            int num2 = dp[i][j - 1] + (gcd(i,j) == 1);
            dp[i][j] = max(num1,num2);
        }
    }
}

int main() {
    int T;scanf("%d",&T);
    init();
    while(T--) {
        int a,b;scanf("%d%d",&a,&b);
        printf("%d\n",dp[a][b]);
    }
    return 0;
}

你可能感兴趣的:(#,其他比赛题目,#,线性dp)