日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 1296 粉刷匠(分组背包套DP)

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 1296 粉刷匠(分组背包套DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

剛開始往網絡流的方向想。建不出圖。。。

因為每次只能對一行進行染色。每一行都是獨立的。

對于每一行,因為格子只能染一次,所以可以發現這是一個多階段決策問題,這個決策就是當前格子染0還是染1.

令dp[i][j][k](k==0||k==1)表示當前行第i個格子用了j次染色,且這次染色染為k色 的最多有效格子。

這樣我們用了O(n*m*m)得出了每一行用了v次染色獲得的最多有效格子val。

顯然的分組背包。每一個組最多選一種。再用O(V*n*m)求一遍分組背包即可。

總復雜度O((V+m)*m*n).

?

# include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # include <set> # include <cmath> # include <algorithm> using namespace std; # define lowbit(x) ((x)&(-x)) # define pi 3.1415926535 # define eps 1e-9 # define MOD 100000007 # define INF 1000000000 # define mem(a,b) memset(a,b,sizeof(a)) # define FOR(i,a,n) for(int i=a; i<=n; ++i) # define FO(i,a,n) for(int i=a; i<n; ++i) # define bug puts("H"); # define lch p<<1,l,mid # define rch p<<1|1,mid+1,r # define mp make_pair # define pb push_back typedef pair<int,int> PII; typedef vector<int> VI; # pragma comment(linker, "/STACK:1024000000,1024000000") typedef long long LL; int Scan() {int res=0, flag=0;char ch;if((ch=getchar())=='-') flag=1;else if(ch>='0'&&ch<='9') res=ch-'0';while((ch=getchar())>='0'&&ch<='9') res=res*10+(ch-'0');return flag?-res:res; } void Out(int a) {if(a<0) {putchar('-'); a=-a;}if(a>=10) Out(a/10);putchar(a%10+'0'); } const int N=2505; //Code begin...int val[55][55], dp[55][55][2], ans[2505]; char s[55][55];int main () {int n, m, T;scanf("%d%d%d",&n,&m,&T);FOR(i,1,n) scanf("%s",s[i]+1);FOR(i,1,n) {mem(dp,0);FOR(j,1,m) FOR(k,1,j) {dp[j][k][0]=max(dp[j-1][k][0],max(dp[j-1][k-1][0],dp[j-1][k-1][1]))+(s[i][j]=='0');dp[j][k][1]=max(dp[j-1][k][1],max(dp[j-1][k-1][0],dp[j-1][k-1][1]))+(s[i][j]=='1');}FOR(j,1,m) val[i][j]=max(dp[m][j][0],dp[m][j][1]);}FOR(i,1,n) for (int j=T; j>=0; --j) for (int k=min(j,m); k>=1; --k)ans[j]=max(ans[j],ans[j-k]+val[i][k]);printf("%d\n",ans[T]);return 0; } View Code

?

轉載于:https://www.cnblogs.com/lishiyao/p/6550684.html

總結

以上是生活随笔為你收集整理的BZOJ 1296 粉刷匠(分组背包套DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。