求助,为什么我的方法会tle,明明是n^2啊
查看原帖
求助,为什么我的方法会tle,明明是n^2啊
144071
2023lyan楼主2023/8/21 17:07
#include<bits/stdc++.h>
using namespace std;
//f(i,j)表示以i开头的且0的个数<=j的最长长度
//g(i,j)表示以i结尾的且0的个数<=j的最长长度
int t,n,k,f[3001][3001],g[3001][3001],ans[3001],v[3001];
string s;
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>k>>s;
        s=' '+s;
        memset(f,0,sizeof(f));
        memset(g,0,sizeof(g));
        memset(ans,0,sizeof(ans));
        memset(v,0,sizeof(v));
        for(int i=1;i<=n;i++)
        {
            int j=0;
            for(int k=i;k<=n;k++)
            {
                if(s[k]=='0')j++;
                f[i][j]=k-i+1;
            }
            j++;
            while(j<=n)
            {
                f[i][j]=f[i][j-1];
                j++;
            }
        }
        for(int i=n;i>=1;i--)
        {
            int j=0;
            for(int k=i;k>=1;k--)
            {
                if(s[k]=='0')j++;
                g[i][j]=i-k+1;
            }
            j++;
            while(j<=n)
            {
                g[i][j]=g[i][j-1];
                j++;
            }
        }
        for(int j=0;j<=n;j++)
        {
            for(int i=1;i<=n;i++)g[i][j]=max(g[i][j],g[i-1][j]);
        }
        for(int j=0;j<=n;j++)
        {
            for(int i=n;i>=1;i--)f[i][j]=max(f[i][j],f[i+1][j]);
        }
        v[0]=1;
        ans[0]=max(g[n][k],f[1][k]);
        for(int i=1;i<=n;i++)
        {
            int cnt=0;
            for(int j=i;j<=n;j++)
            {
                if(s[j]=='1')cnt++;
                if(k<cnt)break;
                ans[j-i+1]=max(ans[j-i+1],f[j+1][k-cnt]);
                ans[j-i+1]=max(ans[j-i+1],g[i-1][k-cnt]);
                v[j-i+1]=1;
            }
        }
        for(int i=1;i<=n;i++)
        {
            int num=0;
            for(int j=0;j<=n;j++)
            {
                if(v[j])num=max(num,i*j+ans[j]);
            }
            printf("%d ",num);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}
2023/8/21 17:07
加载中...