P6622 [省选联考 2020 A/B 卷] 信号传递
题目大意
详细题目传送门
给出
对于一个
你需要求一个长度为
思路
发现
这个时候可以拆贡献,发现对于
这样就优化到了
然后考虑状压动规。如果先考虑
但是可以有转移
那么转移一个
- 若
, , ,所以有贡献 - 若
, , ,所以有贡献 - 若
, , ,所以有贡献 - 若
, , ,所以有贡献
那么可以转移
其中按照定义
那么现在的时间复杂度是
现在我们已经做到了时空都是
代码
#include<bits/stdc++.h>
#define endl '\n'
#define rep(i,a,b) for(register ll i=(a);i<=(b);++i)
using namespace std;
typedef int ll;
const ll MAXN=1e5+5;
const ll MAXM=23;
const ll MAXLM=(1<<23)+2;
ll n,m,k,a[MAXN],cnt[MAXM][MAXM];
namespace Task3{
ll f[MAXLM],bt1[MAXLM],lg[MAXLM];
ll v[MAXLM/2][MAXM];
ll gb(ll x){
ll ans=0;
while(x){
ans+=(x&1);
x>>=1;
}
return ans;
}
void Do(){
memset(f,0x3f,sizeof(f));
f[0]=0;
rep(i,0,(1<<(m))){
bt1[i]=gb(i);
}
rep(i,2,(1<<m)){
lg[i]=lg[i>>1]+1;
}
rep(i,0,m-1){
rep(j,0,m-1){
if(i!=j){
v[0][i]+=k*cnt[j][i]-cnt[i][j];
}
}
}
rep(i,0,m-1){
rep(j,1,(1<<(m-1))-1){
ll lb=(j&(-j)),pc=lg[lb]+(lg[lb]>=i);
v[j][i]=v[j^lb][i]+cnt[i][pc]*(k+1)+cnt[pc][i]*(1-k);
}
}
rep(S,1,(1<<m)-1){
rep(i,0,m-1){
if((S&(1<<i))){
ll ns=S^(1<<i);
ll val=f[ns]+(bt1[ns]+1)*v[(ns&((1<<i)-1))|((ns>>(i+1))<<i)][i];
f[S]=min(f[S],val);
}
}
}
cout<<f[(1<<m)-1]<<endl;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
rep(i,1,n){
cin>>a[i];
a[i]--;
}
rep(i,1,n-1){
cnt[a[i]][a[i+1]]++;
}
Task3::Do();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现