牛客网【每日一题】5月18日 「土」秘法地震
鏈接:
文章目錄
- 題目描述
- 題解:
- 代碼:
題目描述
帕秋莉掌握了一種土屬性魔法
這種魔法可以在一片k×k大小的一個正方形區域內產生地震
但是如果某片即將產生地震的區域內有建筑物,帕秋莉會停止施法
整個地圖大小為n×m,其中一些地方有建筑
請問有多少種可能的情況,使得帕秋莉會停止施法
輸入描述:
第一行三個數n, m, k,意義見描述 接下來一個n×m的01矩陣表示這篇區域的情況,1表示這個地方有建筑
輸出描述:
輸出一個數表示答案
示例1
輸入
輸出
5備注:
對于30%的數據,n, m≤30 對于100%的數據,n, m≤1000,k≤min(n, m)
題解:
關于二維前綴和的題目
我們都知道一維前綴和,二維前綴和就是在一維的基礎上建立的,可以通過二維前綴和求出矩陣內一個任意的子矩陣的數的和。
dp [ i ] [ j ] 表示表示一個矩陣內數的總和
(1,1)與(i,j)這兩個點分別為這個矩陣的左上角,和右下角。
狀態轉移方程為
dp [ i ] [ j ] = d p [ i - 1 ] [ j ] + dp [ i ] [j - 1 ] - d p [ i - 1 ] [ j -1 ] + a [ i ] [ j ]
大致可以理解成:整個矩形區域=左邊區域(1,1)~ (i,j-1)+上面區域(1,1)~(i-1,j),減去重復區域(紅色部分),再加上藍色部分( 當前點( i , j ))
圖片選自
放在本題
當矩陣某點 ( i , j ) 的值為1時,dp [ i ] [ j ] ++
然后求出二維前綴和的值,
然后我們可以通過這些值求出 矩陣的大小是固定的 k * k 的情況是否符合要求
我們枚舉正方形右下角的點 ( i , j )
對于(1,1)到(i,j)的矩陣,
sum=dp [ i+k?1 ] [ j+k?1 ]? dp [ i+k?1 ][ j?1 ]?dp [ i?1 ][ j+k?1 ]+dp [ i ? 1 ] [ j? 1 ]
可以理解成二維前綴和的那個式子倒過來,
用(i,j)的二維前綴和,也就是圖中整個矩形,減去上部分,再減去左部分,加上被多減的紅色部分,剩下的就是藍色部分,也就是我們所求的k*k大的矩陣
sum>0,說明符合條件,結果加一
代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e3+4; char a[maxn][maxn]; int dp[maxn][maxn]; int n,m,k; int main() {int sum=0;cin>>n>>m>>k;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>a[i][j];}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];if(a[i][j]=='1')dp[i][j]++;}for(int i=k;i<=n;i++)for(int j=k;j<=m;j++){if(dp[i][j]-dp[i-k][j]-dp[i][j-k]+dp[i-k][j-k])sum++;}cout<<sum<<endl;return 0; }總結
以上是生活随笔為你收集整理的牛客网【每日一题】5月18日 「土」秘法地震的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改linux文件权限(修改linux
- 下一篇: 牛客网 【每日一题】5月13日 加分二叉