好像一个很暴力的dp做法ac了?
查看原帖
好像一个很暴力的dp做法ac了?
618344
powehi1楼主2024/6/26 18:53

dp[i][j]dp[i][j],考虑前ii个,最小公倍数为jj的最大个数

不会计算第二维的个数,不过这份代码ac了,正确性可以证明吗?

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define endl '\n'

int a[200005], b[200005];
map<int,int> dp[2005];

void solve(){

    int n;
    cin>>n;

    map<int,int> mp;
    for(int i=1;i<=n;i++) cin>>a[i], dp[i].clear(), mp[a[i]] = 1;
    sort(a+1,a+1+n);

    int z = 1;
    for(int i=1;i<=n;i++){
        z = z/__gcd(z,a[i])*a[i];
        if(z>a[n]){
            cout<<n<<endl;
            return ;
        }
    }
    
    dp[0][1] = 0;
    int ans = 0;
    for(int i=1;i<=n;i++){
        for(auto [x,y] : dp[i-1]){
            dp[i][x] = y;
        }
        for(auto [x,y] : dp[i-1]){
            z = x/__gcd(x,a[i])*a[i];
            dp[i][z] = max(dp[i][z],y+1);
            if(!mp.count(z)) ans = max(ans,dp[i][z]);
        }
    }
    cout<<ans<<endl;

}
signed main() {

    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int T;
    cin>>T;
    while(T--){
        solve();
    }

    return 0;
}


2024/6/26 18:53
加载中...