日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客网【每日一题】5月18日 「土」秘法地震

發布時間:2023/12/3 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网【每日一题】5月18日 「土」秘法地震 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:

文章目錄

    • 題目描述
    • 題解:
    • 代碼:

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld

題目描述

帕秋莉掌握了一種土屬性魔法

這種魔法可以在一片k×k大小的一個正方形區域內產生地震

但是如果某片即將產生地震的區域內有建筑物,帕秋莉會停止施法

整個地圖大小為n×m,其中一些地方有建筑

請問有多少種可能的情況,使得帕秋莉會停止施法

輸入描述:

第一行三個數n, m, k,意義見描述 接下來一個n×m的01矩陣表示這篇區域的情況,1表示這個地方有建筑

輸出描述:

輸出一個數表示答案

示例1
輸入

4 4 2 1000 0100 0000 0001

輸出

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日 「土」秘法地震的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。