cf 154.div2 D. Table with Letters - 2

D. Table with Letters - 2

 

      今天的比赛题比较奸诈,居然是文件读入的,让A题耽误了很多时间。

   

      这题是dp的一个经典类型,o((n*m)^2)的算法非常好写,但是必然TLE。因为其要求四角均相等,不妨以此为条件进行判断,即可缩为o(n^2*m)算法

 

    /*
    author:jxy
    lang:C/C++
    university:China,Xidian University
    **If you need to reprint,please indicate the source**
    */
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #define INF 1E9
    using namespace std;
    int sum[402][402];
    char a[402][402];
    int main()
    {
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        int m,n,K,i,j,t;
        scanf("%d%d%d",&n,&m,&K);
        memset(sum,0,sizeof(sum));
        for(i=1;i<=n;i++)
        {
            getchar();
          for(j=1;j<=m;j++)
          {
              a[i][j]=getchar();
              sum[i][j]=0-sum[i-1][j-1]+sum[i-1][j]+sum[i][j-1];
              if(a[i][j]=='a')sum[i][j]++;
          }
        }
        long long ans=0;
        int now[257],k,p;
        for(i=1;i<=n;i++)
          for(j=i+1;j<=n;j++)
          {
              memset(now,0,sizeof(now));
              for(k=1,p=1;k<=m;k++)
              {
                  if(a[i][k]!=a[j][k])continue;
                  now[a[i][k]]--;
                 // if(p==1)p=k;
                  //cout<<now[a[i][k]]<<endl;
                  while(p<=m&&sum[j][p]+sum[i-1][k-1]-sum[i-1][p]-sum[j][k-1]<=K)
                  {
                      if(a[i][p]==a[j][p])now[a[i][p]]++;
                      p++;
                  }
                  if(now[a[i][k]]>0)ans+=now[a[i][k]];
                  //cout<<now[a[i][k]]<<" --------"<<endl;
              }
          }
        cout<<ans<<endl;
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值