AC了,但是疑似乱搞
查看原帖
AC了,但是疑似乱搞
1096564
LZMqueueNB楼主2023/11/8 16:37

rt,我使用的方法是对于每一行求出涂了k次的最大值,这个用 gg 数组存下来,最后再把每一行看成一个点进行背包,过了样例就直接AC了。但我将 gg 数组输出出来,发现第三行的第二个很明显错了,也就是 g[3][2]g[3][2] ,应该是第三行涂两次,很显然是6个格子,但是输出的却是4个格子。非常诡异。(代码里带有被注释掉的调试)

#include<bits/stdc++.h>
#define int long long 
#define M(x,y) memset(x,y,sizeof(x))
#define rep(i,x,y) for(int i=(x);i<=(y);i++)
#define per(i,x,y) for(int i=(x);i>=(y);i--)
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline void swap(int & x,int & y){x^=y^=x^=y;}
inline int read()
{
    int x=0,s=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())if(ch=='-')s=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-48;
    return x*s;
}

const int N=110;

int n,m,T;
char a[N][N];
int sum0[N][N],sum1[N][N];
int g[N][2510];
int f[N][2510];
int dp[N][2510];

signed main()
{
    n=read();m=read();T=read();
    rep(i,1,n)scanf("%s",a[i]+1);
    rep(i,1,n)rep(l,1,m)sum0[i][l]=sum0[i][l-1]+(a[i][l]=='0');
    rep(i,1,n)rep(l,1,m)sum1[i][l]=sum1[i][l-1]+(a[i][l]=='1');
    rep(i,1,n)
    {
        M(f,0);
        rep(l,1,m)per(j,l,1)rep(k,1,m)f[l][k]=max(f[l][k],f[j-1][k-1]+max(sum0[i][l]-sum0[i][j-1],sum1[i][l]-sum1[i][j-1]));

        // rep(i,1,m)rep(k,1,m)printf("f[%lld][%lld]=%lld\n",i,k,f[i][k]);

        rep(k,1,m)rep(l,1,m)g[i][k]=max(g[i][k],f[l][k]);
    }
    // rep(i,1,n)
    // {
    //     rep(l,1,T)std::cerr<<g[i][l]<<' ';
    //     std::cerr<<'\n';
    // }
    rep(i,1,n)rep(l,0,m)rep(j,l,T)dp[i][j]=max(dp[i][j],dp[i-1][j-l]+g[i][l]);
    printf("%lld\n",dp[n][T]);
    return 0;
}
2023/11/8 16:37
加载中...