方格稿纸(二维前缀和)
題目描述
小 y 終于在小學學會了一些字、詞、句子,會寫一點作文了。某一天,小 y 買了一張方格稿紙來寫作文,稿紙是??行??列的,形狀如下所示(圖中?):
某天小 y 的鄰居 小 x 來 小 y 家玩,無聊地用黑墨水筆把 小 y 新買的方格稿紙涂黑了很多格子。每個格子不是完全黑色就是完全白色,如下圖所示。
小 y 不能責怪小 x。作文寫不成了,他也覺得很無聊,就開始數里面有多少“魔幻方陣”。如果稿紙中一個??的正方形區域滿足以下兩個條件,那么它就是魔幻方陣:
(1) 黑白格子的數量差不能超過?;
(2)?不能小于?。
上圖染色后的方格稿紙共有??個魔幻方陣(??個??的魔幻方陣 ,?個??的魔幻方陣)。
現在,請你幫助小 y 編程計算被染色的稿紙里面有多少個魔幻方陣。
關于二維前綴和建議參考二維前綴和!_Banzed的博客-CSDN博客_二維前綴和
#include <iostream>
#include <math.h>
using namespace std;
int n,m,sum;
int a[310][310];
int dp[310][310];
int main() {
?? ?cin>>n>>m;
?? ?for (int i=1;i<=n;i++)?
?? ??? ?for (int j=1;j<=m;j++) {
?? ??? ??? ?cin>>a[i][j];
?? ??? ??? ?dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j];//動態轉移式方程
?? ??? ?}
?? ?int ans1,ans2;
?? ?for (int k=2;k<=max(n,m);k++) {
?? ??? ?ans1=ans2=0;
?? ??? ?for (int i=1;i<=n-k+1;i++) {
?? ??? ??? ?for (int j=1;j<=m-k+1;j++) {
?? ??? ??? ??? ?int x=i+k-1,
?? ??? ??? ??? ??? ?y=j+k-1;
?? ??? ??? ??? ?ans1 = dp[x][y]-dp[i-1][y]-dp[x][j-1]+dp[i-1][j-1];
?? ??? ??? ??? ?ans2 = k*k-ans1;
?? ??? ??? ??? ?if (abs(ans1-ans2) <= 1)
?? ??? ??? ??? ??? ?sum++;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?cout<<sum;
?? ?return 0;
}
總結
以上是生活随笔為你收集整理的方格稿纸(二维前缀和)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学计算机的怎么防辐射,一种学生用防辐射计
- 下一篇: 10大改变世界的未来科技