关于刚刚ABC F题,我有一个状态压缩的做法,就是说装压状态 i 例如(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;
}
//斜率越大越好
是我写的有问题还是算法有问题