CF1181C Flag (dp 思维)

简介: CF1181C Flag (dp 思维)

原题链接

题意:

20200401134307494.png

思路:

设d p [ i ] [ j ]表示以( i , j )为起点,相同颜色的继续向下延伸,最大的扩展距离。

O ( n 2 )枚举每个点作为右上角的答案,判断同一列的i + d , i + 2 d的颜色和d p是否符合条件,判断i + 3 d是否越界。对于上一列,如果能够连接这列的话也要增加答案。

代码:

char s[1100][1100];
int dp[1100][1100];
int main(){
  int n=read,m=read;
  rep(i,1,n) scanf("%s",s[i]+1);
  for(int i=n;i;i--)
    for(int j=1;j<=m;j++){
      if(s[i][j]==s[i+1][j]) dp[i][j]=dp[i+1][j]+1;
      else dp[i][j]=1;
    }
/*  rep(i,1,n) rep(j,1,m){
    cout<<dp[i][j]<<" ";
    if(j==m) puts("");
  }*/
  int ans=0;
  for(int i=1;i<=n;i++){
    int tmp=0;
    for(int j=1;j<=m;j++){
      int d=dp[i][j];
      if(i+3*d-1<=n&&dp[i+d][j]==d&&dp[i+2*d][j]>=d&&s[i][j]!=s[i+d][j]&&s[i+d][j]!=s[i+2*d][j]){
        if(dp[i][j-1]==d&&dp[i+d][j-1]==d&&dp[2*d+i][j]>=d&&s[i][j]==s[i][j-1]&&s[i+d][j]==s[i+d][j-1]&&s[i+2*d][j]==s[i+2*d][j-1]){
          tmp++;
        }
        else tmp=1;
      }
      else tmp=0;
      ans+=tmp;
    }
  }
  printf("%d",ans);
    return 0;
}
/*
4 3
aaa
bbb
ccb
ddd
*/ 
目录
相关文章
|
5月前
CF 1538 G. Gift Set (贪心+思维)
【6月更文挑战第14天】
36 0
|
6月前
|
算法
算法系列--两个数组的dp问题(2)(下)
算法系列--两个数组的dp问题(2)(下)
35 0
|
6月前
|
算法 计算机视觉
算法系列--两个数组的dp问题(1)(下)
算法系列--两个数组的dp问题(1)
40 0
|
6月前
|
算法
算法系列--两个数组的dp问题(2)(上)
算法系列--两个数组的dp问题(2)
30 0
|
6月前
|
算法
算法系列--两个数组的dp问题(1)(上)
算法系列--两个数组的dp问题(1)
30 0
|
机器学习/深度学习 人工智能 算法
CF1550A Find The Array(贪心算法)
CF1550A Find The Array(贪心算法)
36 0
|
机器学习/深度学习
CF2A Winner(map+思维)
CF2A Winner(map+思维)
90 0
|
机器学习/深度学习
cf 910A(单调队列优化dp)
cf 910A(单调队列优化dp)
92 0
cf 327A (前缀和优化dp)
cf 327A (前缀和优化dp)
65 0
|
人工智能
CF 859C - Pie Rules(dp好题)
CF 859C - Pie Rules(dp好题)
121 0