<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【比賽記錄】狀態壓縮專題測試


      A. [CCO2015] 路短最
      \(dp[i][S]\) 表示走到 \(i\) 點,經過的點集為 \(S\) 的最長路,用類似于 spfa 的方式轉移即可。
      復雜度是一個 bfs,具體不太會證。

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      #define read(x){\
      	char ch;\
      	int fu=1;\
      	while(!isdigit(ch=getchar()))\
      		fu-=(ch=='-')<<1;\
      	x=ch&15;\
      	while(isdigit(ch=getchar()))\
      		x=(x<<1)+(x<<3)+(ch&15);\
      	x*=fu;\
      }
      #define pii pair<int,int>
      #define pb push_back
      #define mp make_pair
      #define fir first
      #define sec second
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int maxn=(1<<18)+5;
      const int inf=0x3f3f3f3f;
      int n,m,dp[25][maxn];
      vector<pii> e[25];
      queue<pii> q;
      bitset<maxn> vis[25];
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      	read(n)read(m);
      	for(int i=1,u,v,w;i<=m;i++){
      		read(u)read(v)read(w);
      		e[u].pb(mp(v,w));
      	}
      	memset(dp,-0x3f,sizeof dp);
      	dp[0][1]=0;
      	q.push(mp(0,1));
      	vis[0][1]=1;
      	while(q.size()){
      		int u=q.front().fir,S=q.front().sec;
      		q.pop(),vis[u][S]=0;
      		for(pii i:e[u]){
      			int v=i.fir,w=i.sec;
      			if(S>>v&1){
      				continue;
      			}
      			int nS=S|1<<v;
      			if(dp[v][nS]<dp[u][S]+w){
      				dp[v][nS]=dp[u][S]+w;
      				if(!vis[v][nS]){
      					q.push(mp(v,nS));
      					vis[v][nS]=1;
      				}
      			}
      		}
      	}
      	int ans=-inf;
      	for(int S=0;S<1<<n;S++){
      		ans=max(ans,dp[n-1][S]);
      	}
      	printf("%d",ans);
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      B. [GDOI2014] 拯救莫莉斯
      因為 \(n\times m\le50\),并且 \(m\le n\),所以 \(m\) 最大為 \(7\)。于是可以狀壓。
      \(f[i][S1][S2]\) 表示第 \(i-1\) 行建造油庫的狀態為 \(S1\),第 \(i\) 行的狀態為 \(S2\),且第 \(1\)\(i-1\) 行都已合法的最小花費,\(g[i][S1][S2]\) 為相應的最小油庫數。轉移時枚舉上一行、這一行、下一行的狀態 \(S1\)\(S2\),\(S3\) 即可。
      判斷轉移條件:
      ((S1|S2|S3|S2<<1|S2>>1)&uS)==uS
      其中 \(uS\) 為全集。
      時間復雜度 \(O(n8^m)\)。

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      #define read(x){\
      	char ch;\
      	int fu=1;\
      	while(!isdigit(ch=getchar()))\
      		fu-=(ch=='-')<<1;\
      	x=ch&15;\
      	while(isdigit(ch=getchar()))\
      		x=(x<<1)+(x<<3)+(ch&15);\
      	x*=fu;\
      }
      #define popcnt __builtin_popcount
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int maxn=(1<<7)+5;
      const int inf=0x3f3f3f3f;
      int n,m,a[55][15];
      int sum[55][maxn];
      int f[55][maxn][maxn];
      int g[55][maxn][maxn];
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      	read(n)read(m);
      	for(int i=1;i<=n;i++){
      		for(int j=1;j<=m;j++){
      			read(a[i][j]);
      		}
      	}
      	for(int i=1;i<=n;i++){
      		for(int S=0;S<1<<m;S++){
      			for(int j=1;j<=m;j++){
      				if(S>>(j-1)&1){
      					sum[i][S]+=a[i][j];
      				}
      			}
      		}
      	}
      	memset(f,0x3f,sizeof f);
      	memset(g,0x3f,sizeof g);
      	int uS=(1<<m)-1;
      	for(int S=0;S<=uS;S++){
      		f[1][0][S]=sum[1][S];
      		g[1][0][S]=popcnt(S);
      	}
      	for(int i=1;i<n;i++){
      		for(int S1=0;S1<=uS;S1++){
      			for(int S2=0;S2<=uS;S2++){
      				if(f[i][S1][S2]>=inf){
      					continue;
      				}
      				for(int S3=0;S3<=uS;S3++){
      					if(((S1|S2|S3|S2<<1|S2>>1)&uS)==uS){
      						if(f[i+1][S2][S3]>f[i][S1][S2]+sum[i+1][S3]){
      							f[i+1][S2][S3]=f[i][S1][S2]+sum[i+1][S3];
      							g[i+1][S2][S3]=g[i][S1][S2]+popcnt(S3);
      						}
      						else if(f[i+1][S2][S3]==f[i][S1][S2]+sum[i+1][S3]){
      							g[i+1][S2][S3]=min(g[i+1][S2][S3],g[i][S1][S2]+popcnt(S3));
      						}
      					}
      				}
      			}
      		}
      	}
      	int ans1=inf,ans2=inf;
      	for(int S1=0;S1<=uS;S1++){
      		for(int S2=0;S2<=uS;S2++){
      			if(((S1|S2|S2<<1|S2>>1)&uS)==uS){
      				if(ans1>f[n][S1][S2]){
      					ans1=f[n][S1][S2];
      					ans2=g[n][S1][S2];
      				}
      				else if(ans1==f[n][S1][S2]){
      					ans2=min(ans2,g[n][S1][S2]);
      				}
      			}
      		}
      	}
      	printf("%d %d",ans2,ans1);
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      C. 萃香抱西瓜
      \(dp[t][x][y][S]\) 表示 \(t\) 時刻,坐標為 \((x,y)\),拿到的小西瓜為 \(S\) 的最小移動次數。刷表法轉移就行了。
      時間復雜度 \(O(hwTn2^m)\)

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      #define read(x){\
      	char ch;\
      	int fu=1;\
      	while(!isdigit(ch=getchar()))\
      		fu-=(ch=='-')<<1;\
      	x=ch&15;\
      	while(isdigit(ch=getchar()))\
      		x=(x<<1)+(x<<3)+(ch&15);\
      	x*=fu;\
      }
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int inf=0x3f3f3f3f;
      const int dx[]={0,0,-1,1};
      const int dy[]={-1,1,0,0};
      int h,w,tot,sx,sy,n,m,hao[25];
      int px[25][105],py[25][105];
      int f[105][10][10][(1<<10)+5];
      il void upd(int &x,int y){
      	x=min(x,y);
      }
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      //	freopen("P3786_2.in","r",stdin);
      //	freopen("P3786_2.ans","w",stdout);
      	read(h)read(w)read(tot);
      	read(sx)read(sy)read(n)read(m);
      	m=0;
      	for(int i=1,opt,t1,t2;i<=n;i++){
      		read(t1)read(t2)read(opt);
      		if(opt){
      			hao[i]=++m;
      		}
      		while(t1<t2){
      			read(px[i][t1])read(py[i][t1]);
      			t1++;
      		}
      	}
      	memset(f,0x3f,sizeof f);
      	for(int i=1;i<=n;i++){
      		if(px[i][1]==sx&&py[i][1]==sy){
      			if(hao[i]){
      				f[1][sx][sy][1<<(hao[i]-1)]=0;
      			}
      			goto togo1;
      		}
      	}
      	f[1][sx][sy][0]=0;
      	togo1:;
      	for(int t=1;t<tot;t++){
      		for(int x=1;x<=w;x++){
      			for(int y=1;y<=h;y++){
      				for(int S=0;S<1<<m;S++){
      					if(f[t][x][y][S]>=inf){
      						continue;
      					}
      					for(int i=1;i<=n;i++){
      						if(px[i][t+1]==x&&py[i][t+1]==y){
      							if(hao[i]&&(S>>(hao[i]-1)&1)==0){
      								upd(f[t+1][x][y][S|1<<(hao[i]-1)],f[t][x][y][S]);
      								goto togo2;
      							}
      							else if(!hao[i]){
      								goto togo2;
      							}
      						}
      					}
      					upd(f[t+1][x][y][S],f[t][x][y][S]);
      					togo2:;
      					for(int j=0,nx,ny;j<=3;j++){
      						nx=x+dx[j],ny=y+dy[j];
      						if(nx<1||nx>w||ny<1||ny>h){
      							continue;
      						}
      						for(int i=1;i<=n;i++){
      							if(px[i][t+1]==nx&&py[i][t+1]==ny){
      								if(hao[i]&&(S>>(hao[i]-1)&1)==0){
      									upd(f[t+1][nx][ny][S|1<<(hao[i]-1)],f[t][x][y][S]+1);
      									goto togo3;
      								}
      								else if(!hao[i]){
      									goto togo3;
      								}
      							}
      						}
      						upd(f[t+1][nx][ny][S],f[t][x][y][S]+1);
      						togo3:;
      					}
      				}
      			}
      		}
      	}
      //	for(int t=1;t<=tot;t++){
      //		for(int x=1;x<=w;x++){
      //			for(int y=1;y<=w;y++){
      //				for(int S=0;S<1<<m;S++){
      //					printf("%2d %d %d ",t,x,y);
      //					cout<<bitset<10>(S)<<" ";
      //					printf("%10d\n",f[t][x][y][S]);
      //				}
      //			}
      //		}
      //	}
      	int ans=inf;
      	for(int x=1;x<=w;x++){
      		for(int y=1;y<=h;y++){
      			ans=min(ans,f[tot][x][y][(1<<m)-1]);
      		}
      	}
      	printf("%d",ans>=inf?-1:ans);
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      D. [COCI2020-2021#3] Selotejp
      我也是打上輪廓線DP了。
      \(f[x][y][S]\) 表示當前在 \((x,y)\) 格子,前 \(m\) 個格子的狀態為 \(S\) 時的最小花費。
      這里的狀態是指,這一格豎著覆蓋為 \(1\),橫著覆蓋或本來就不用覆蓋為 \(0\)
      這里的前 \(m\) 個格子如下圖所示,假設 \(m=4\),當前在 \((2,2)\),方格內的數表示在 \(S\) 中從低到高的下標(從 \(0\) 開始):

      它就是一個逐行遍歷矩陣的順序,注意是包括 \((x,y)\) 這一格的。
      為什么要這樣記錄呢,因為存在豎著覆蓋,如剛才的例子,\((2,2)\) 的下一個為 \((2,3)\),它的上面是 \((1,3)\),剛好被記錄了狀態。
      于是轉移其實不難想:

      • 下一位 \((nx,ny)\)#
        • 橫著覆蓋,判斷左邊有沒有點,且這個點是不是橫著覆蓋的,即 \(f[nx][ny][S>>1]\)\(f[x][y][S]\)\(f[x][y][S]+1\) 轉移。
        • 豎著覆蓋,判斷上面的點是不是豎著覆蓋的,即 \(f[nx][ny][S>>1\mid 1<<(m-1)]\)\(f[x][y][S]\)\(f[x][y][S]+1\) 轉移。
      • 下一位為 .,直接讓 \(f[nx][ny][S>>1]\)\(f[x][y][S]\) 轉移。

      復雜度 \(O(nm2^m)\)

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      #define read(x){\
      	char ch;\
      	int fu=1;\
      	while(!isdigit(ch=getchar()))\
      		fu-=(ch=='-')<<1;\
      	x=ch&15;\
      	while(isdigit(ch=getchar()))\
      		x=(x<<1)+(x<<3)+(ch&15);\
      	x*=fu;\
      }
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int maxn=(1<<10)+5;
      const int inf=0x3f3f3f3f;
      int n,m,f[maxn][15][maxn];
      char s[maxn][15];
      il void upd(int &x,int y){
      	x=min(x,y);
      }
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      	read(n)read(m);
      	for(int i=1;i<=n;i++){
      		scanf(" %s",s[i]+1);
      	}
      	memset(f,0x3f,sizeof f);
      	if(s[1][1]=='#'){
      		f[1][1][0]=f[1][1][1<<(m-1)]=1;
      	}
      	else{
      		f[1][1][0]=0;
      	}
      	for(int x=1;x<=n;x++){
      		for(int y=1;y<=m;y++){
      			for(int S=0,nx,ny;S<1<<m;S++){
      				if(f[x][y][S]>=inf){
      					continue;
      				}
      				nx=x+y/m;
      				ny=y%m+1;
      				if(s[nx][ny]=='#'){
      					if(ny>1&&(S>>(m-1)&1)==0&&s[x][y]=='#'){
      						upd(f[nx][ny][S>>1],f[x][y][S]);
      					}
      					else{
      						upd(f[nx][ny][S>>1],f[x][y][S]+1);
      					}
      					if(nx>1&&(S&1)){
      						upd(f[nx][ny][S>>1|1<<(m-1)],f[x][y][S]);
      					}
      					else{
      						upd(f[nx][ny][S>>1|1<<(m-1)],f[x][y][S]+1);
      					}
      				}
      				else{
      					upd(f[nx][ny][S>>1],f[x][y][S]);
      				}
      			}
      		}
      	}
      	int ans=inf;
      	for(int S=0;S<1<<m;S++){
      		ans=min(ans,f[n][m][S]);
      	}
      	printf("%d",ans);
      	return 0;
      }
      }
      int main(){return asbt::main();}
      
      posted @ 2024-12-29 18:07  zhangxy__hp  閱讀(19)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产成本人片无码免费| 亚洲欧美在线一区中文字幕| 成人亚洲综合av天堂| 亚洲国产中文在线有精品| 欧洲国产成人久久精品综合 | 不卡在线一区二区三区视频| 99在线精品国自产拍中文字幕| 高清不卡一区二区三区| 亚洲综合一区无码精品| 亚洲精品日产AⅤ| 浠水县| 亚洲综合一区二区三区在线| 久久人与动人物a级毛片| 精品久久人人妻人人做精品 | 亚洲中文字幕人妻系列| 极品少妇xxxx| 成人精品区| 亚洲精品自拍视频在线看| 国产精品毛片av999999| 无遮高潮国产免费观看| 老熟妇欲乱一区二区三区| 4399理论片午午伦夜理片| 午夜av高清在线观看| 精品无套挺进少妇内谢| 日韩中文字幕高清有码| 久久久国产乱子伦精品作者| 精品人妻伦一二三区久久| 国产精品白丝一区二区三区| 欧美日韩v| 国产一区二区三区怡红院| 国产成人综合久久亚洲精品| julia无码中文字幕一区| 日日摸夜夜添夜夜添国产三级| 精品自拍偷拍一区二区三区| 亚洲综合天堂一区二区三区| 免费人成再在线观看视频| 久久亚洲精品成人av秋霞| 在线免费观看毛片av| 少妇人妻偷人精品免费| 国产性生大片免费观看性| 亚洲AV永久中文无码精品综合|