求助 70 pts , 为啥会有负数
查看原帖
求助 70 pts , 为啥会有负数
1406678
hky_lightning楼主2024/12/14 09:17
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,M=20;
int h[N][M],siz[M],num[N]; 
int a[N],dp[1<<M];
int n,m;
int lowbit(int x){
	return x&-x;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]--;
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<m;j++){
			h[i][j]=h[i-1][j];
			if(a[i]==j){
				siz[a[i]]++; 
			}
			else{
				h[i][j]++;
			} 	
		}
	}
	for(int i=0;i<m;i++){
		num[1<<i]=siz[i];
	}
	for(int i=0;i<(1<<m);i++){
		num[i]=num[i^lowbit(i)]+num[lowbit(i)];
	}
	memset(dp,0x3f,sizeof(dp));
	dp[0]=0;
	for(int i=0;i<(1<<m);i++){
		for(int j=0;j<m;j++){
			if(i&(1<<j)){
				dp[i]=min(dp[i],dp[i^(1<<j)]+h[num[i]][j]-h[num[i^(1<<j)]][j]);
			}
		}
	}
	cout<<dp[(1<<m)-1];
} 
2024/12/14 09:17
加载中...