C. Barcode dp
生活随笔
收集整理的這篇文章主要介紹了
C. Barcode dp
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
https://codeforces.com/problemset/problem/225/C
?
這個題目和之前一個題目很像?https://www.cnblogs.com/EchoZQN/p/10900373.html
只是這個數(shù)據(jù)范圍更大一些,
不過剛開始我真的沒有看出來。。。。
這個就是整列整列的處理,所以還是一樣枚舉當前的連續(xù)的j
dp[i][j][k] 這個k只有兩個取值,一個是0,一個是1,0 代表白色,1代表黑色。
這個定義就是dp[i][j][0] 前面i個連續(xù)j個白色的列需要粉刷的最少的磚的數(shù)量。
另外一個同樣,
所以按照之前的想法,很賤的就可以知道會有兩種情況,一個是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; }?
轉(zhuǎn)載于:https://www.cnblogs.com/EchoZQN/p/10904952.html
總結
以上是生活随笔為你收集整理的C. Barcode dp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kotlin实现流读取
- 下一篇: 团队任务3:第一次冲刺