玄关求解
  • 板块学术版
  • 楼主xiao7_Mr_10_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/10 22:00
  • 上次更新2024/8/10 23:52:07
查看原帖
玄关求解
961149
xiao7_Mr_10_楼主2024/8/10 22:00

关于刚刚ABC F题,我有一个状态压缩的做法,就是说装压状态 ii 例如(010101)表示顺序问题,然后1表示有0表示没有,然后这样转移

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
struct Point{
	int c[10],d[10],val;
}f[(1<<10)+5],g[(1<<10)+5];
int n,m,a[N],b[N];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i <= n;i++)cin >> a[i] >>b[i];
	f[0].c[0]=1,f[0].val=1;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j < (1<<m);j++)g[j].val=0;
		for(int j = 0;j < (1<<m)-1;j++){
			for(int k = 0;k < m;k++){
				if(j&(1<<k))continue;
				Point tmp=f[j];tmp.c[k]=a[i],tmp.d[k]=b[i];
				int ans=0,mul=1;
				for(int l = m-1;l >= 0;l--){
					ans+=mul*tmp.d[l];
					if(tmp.c[l])mul*=tmp.c[l];
				}
				ans+=mul;
				tmp.val=ans;
				if(ans)cout << ans << " update\n";
				if(g[j+(1<<k)].val<ans)g[j+(1<<k)]=tmp;
			}
		}
		for(int j = 1;j < (1<<m);j++)f[j]=g[j];
	}
	int ans=0;
	for(int i = 0;i < (1<<m);i++)ans=max(ans,g[i].val);
	cout << ans;
	return 0;
}
//斜率越大越好

是我写的有问题还是算法有问题

2024/8/10 22:00
加载中...