状态压缩输出INF求调
  • 板块P1777 帮助
  • 楼主CNS_5t0_0r2
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/10 14:03
  • 上次更新2024/7/10 14:06:06
查看原帖
状态压缩输出INF求调
999274
CNS_5t0_0r2楼主2024/7/10 14:03
#include<bits/stdc++.h>
using namespace std;
const int N = 109,M = 8,K = 1 << M;
int n,k;
int a[N];
int dp[N][N][K][M + 1];
int lowbit(int x){
	return x & (-x);
}
int popcount(int x){
	int ret = 0;
	while(x){
		ret++;
		x -= lowbit(x);
	}
	return ret;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	for(int id = 1;;id++){
		cin >> n >> k;
		if(n == 0 && k == 0)
			return 0;
		int st = 0;//初始状态 
		for(int i = 1;i <= n;i++){
			cin >> a[i];
			a[i] -= 25;
			st |= 1 << a[i];
		}
		memset(dp,0x3f,sizeof dp);
		dp[0][0][0][0] = 0;
		dp[0][0][0][7] = 0;
		for(int i = 1;i <= n;i++){
			for(int j = 0;j <= min(i,k);j++){
				for(int stat = 0;stat < K;stat++){
					for(int now = 0;now < M;now++){
						if(!((k >> a[i]) & 1))//不存在高度为a[i]的书 
							continue;
						//拿走第i本书
						if(j)
							dp[i][j][stat][now] = min(dp[i][j][stat][now],dp[i - 1][j - 1][stat][now]);
						
						//不拿走第i本书
						for(int last = 0;last < M;last++)
							dp[i][j][stat][a[i]] = min(dp[i][j][stat][a[i]],min(dp[i - 1][j][stat][last] + (a[i] != last),dp[i - 1][j][stat - (1 << a[i])][last] + (a[i] != last)));
						
					}
				}
			}
		}
		int ans = 0x3f3f3f3f;
		for(int i = 0;i <= k;i++)
			for(int j = 0;j < K;j++)
				for(int k = 0;k < M;k++)
					ans = min(ans,dp[n][i][j][k] + popcount(st ^ j));
		cout << "Case " << id << ": " << ans << "\n\n";
	}
	return 0;
} 
2024/7/10 14:03
加载中...