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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C. Barcode dp

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C. Barcode dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://codeforces.com/problemset/problem/225/C

?

這個題目和之前一個題目很像?https://www.cnblogs.com/EchoZQN/p/10900373.html

只是這個數據范圍更大一些,

不過剛開始我真的沒有看出來。。。。

這個就是整列整列的處理,所以還是一樣枚舉當前的連續的j

dp[i][j][k] 這個k只有兩個取值,一個是0,一個是1,0 代表白色,1代表黑色。

這個定義就是dp[i][j][0] 前面i個連續j個白色的列需要粉刷的最少的磚的數量。

另外一個同樣,

所以按照之前的想法,很賤的就可以知道會有兩種情況,一個是j==1 那就說明是之前的情況推過來的,因為之前的這個j不確定,

所以這里要枚舉每一種情況。

?

#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<queue> #include<vector> #define inf 0x3f3f3f3f #define debug(x) cout<<"-----"<<" x = "<<x<<"-----"<<endl using namespace std; typedef long long ll; const int maxn = 5e3 + 10; ll dp[1010][1010][2]; char s[1010][1010]; int b[1010], w[1010]; int main() {int n, m, x, y;scanf("%d%d%d%d", &n, &m, &x, &y);for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1);for(int j=1;j<=m;j++){for(int i=1;i<=n;i++){if (s[i][j] == '.') w[j]++;else b[j]++;}}memset(dp, inf, sizeof(dp));dp[1][1][0] = b[1];dp[1][1][1] = w[1];for(int i=1;i<=m;i++){for(int j=1;j<=y&&j<=i;j++){if(j!=1){dp[i][j][0] = dp[i-1][j-1][0] + b[i];dp[i][j][1] = dp[i-1][j-1][1] + w[i];}else{for(int k=x;k<=y;k++){dp[i][j][0] = min(dp[i][j][0], dp[i-1][k][1] + b[i]);dp[i][j][1] = min(dp[i][j][1], dp[i-1][k][0] + w[i]);}}// printf("dp[%d][%d][0]=%lld\n", i, j, dp[i][j][0]);// printf("dp[%d][%d][1]=%lld\n", i, j, dp[i][j][1]); }}ll ans = inf;for(int i=x;i<=y;i++){ans = min(ans, dp[m][i][0]);ans = min(ans, dp[m][i][1]);}printf("%lld\n", ans);return 0; }

?

轉載于:https://www.cnblogs.com/EchoZQN/p/10904952.html

總結

以上是生活随笔為你收集整理的C. Barcode dp的全部內容,希望文章能夠幫你解決所遇到的問題。

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