Codeforces225 C.Barcode(dp)

题意:

Codeforces225 C.Barcode(dp)

解法:

d[i][0/1]表示前i列合法,第i列为颜色k=0/1的方案数,
在[x,y]范围内枚举j,设当前为d[i][k],
那么d[i+j][k^1]=min(d[i+j][k^1],d[i][k]+([i+1,j]颜色变成(k^1)的代价));

code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define PI pair<int,int>
const int maxm=2e3+5;
char s[maxm][maxm];
int sum[maxm][2];
int a[maxm][2];
int d[maxm][2];
int n,m,x,y;
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m>>x>>y;
    for(int i=1;i<=n;i++){
        cin>>(s[i]+1);
        for(int j=1;j<=m;j++){
            if(s[i][j]=='#'){
                a[j][0]++;
            }else{
                a[j][1]++;
            }
        }
    }
    for(int i=1;i<=m;i++){
        sum[i][0]=sum[i-1][0]+a[i][0];
        sum[i][1]=sum[i-1][1]+a[i][1];
    }
    for(int i=1;i<=m;i++)d[i][0]=d[i][1]=1e18;
    d[0][0]=d[0][1]=0;
    for(int i=0;i<=m;i++){
        for(int k=0;k<2;k++){
            if(d[i][k]==1e18)continue;
            for(int j=x;j<=y&&i+j<=m;j++){
                d[i+j][k^1]=min(d[i+j][k^1],d[i][k]+sum[i+j][k^1]-sum[i][k^1]);
            }
        }
    }
    cout<<min(d[m][0],d[m][1])<<endl;
    return 0;
}

上一篇:easypoi


下一篇:EasyPoi导出Excel