​原题链接​​ 题意:

CF1181C Flag (dp 思维)_动态规划

思路:
CF1181C Flag (dp 思维)_i++_02表示以CF1181C Flag (dp 思维)_动态规划_03为起点,相同颜色的继续向下延伸,最大的扩展距离。
CF1181C Flag (dp 思维)_3d_04枚举每个点作为右上角的答案,判断同一列的CF1181C Flag (dp 思维)_概率论_05的颜色和CF1181C Flag (dp 思维)_动态规划_06是否符合条件,判断CF1181C Flag (dp 思维)_3d_07是否越界。对于上一列,如果能够连接这列的话也要增加答案。
代码:

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
*/