国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

Round C APAC Test 2017 Problem B. Safe Squares (C++)

2019-11-08 01:00:28
字體:
供稿:網(wǎng)友

PRoblem

Codejamon trainers are actively looking for monsters, but if you are not a trainer, these monsters could be really dangerous for you. You might want to find safe places that do not have any monsters!

Consider our world as a grid, and some of the cells have been occupied by monsters. We define a safe square as a grid-aligned D × D square of grid cells (with D ≥ 1) that does not contain any monsters. Your task is to find out how many safe squares (of any size) we have in the entire world. Input

The first line of the input gives the number of test cases, T. T test cases follow. Each test case starts with a line with three integers, R, C, and K. The grid has R rows and C columns, and contains K monsters. K more lines follow; each contains two integers Ri and Ci, indicating the row and column that the i-th monster is in. (Rows are numbered from top to bottom, starting from 0; columns are numbered from left to right, starting from 0.) Output

For each test case, output one line containing Case #x: y, where x is the test case number (starting from 1) and y is the the total number of safe zones for this test case. Limits

1 ≤ T ≤ 20.

(Ri, Ci) ≠ (Rj, Cj) for i ≠ j. (No two monsters are in the same grid cell.)

0 ≤ Ri < R, i from 1 to K

0 ≤ Ci < C, i from 1 to K

Small dataset

1 ≤ R ≤ 10.

1 ≤ C ≤ 10.

0 ≤ K ≤ 10.

Large dataset

1 ≤ R ≤ 3000.

1 ≤ C ≤ 3000.

0 ≤ K ≤ 3000.

分析:

想到用動態(tài)規(guī)劃來做。開一個數(shù)組dp[R+1][C+1],其中dp[i][j]表示原矩陣中[0][0]到[i-1][j-1]范圍內(nèi)的safe square個數(shù)。顯然,當(dāng)矩陣[i-1][j-1]位置有monster時:
dp[i][j]=dp[i-1][j+dp[i][j-1]-dp[i][j] 其中要減去重復(fù)計算的部分

然而,當(dāng)矩陣[i-1][j-1]位置無monster,即為安全的時候,就要考慮更多了:因為由于[i-1][j-1]位置是安全的,導(dǎo)致產(chǎn)生了新的safe square。這時候我用另外的兩個矩陣來存儲了需要的信息,即square[R+1][C+1]及stretch[R+1][C+1]。

- square[i][j]表示:原矩陣中[0][0]到[i-1][j-1]范圍內(nèi)包含[i-1][j-1]位置的safe square個數(shù)- stretch的每個元素是一個pair,stretch[i][j].first(second)表示位置[i-1][j-1]及其左邊(上邊)緊鄰的安全的位置個數(shù)

這兩個矩陣可以幫助計算[i-1][j-1]位置的加入而新產(chǎn)生的safe square個數(shù),即為

min(min(stretch[i][j].first, stretch[i][j].second), square[i - 1][j - 1] + 1)

最后返回dp[R][C]即可

這里我的方法開了很多數(shù)組,占用了不少空間??隙ㄟ€有更好的方法解決這個問題。

代碼:Github

#include <iostream>#include <math.h>#include <vector>#include <stack>#include <queue>#include <algorithm>#include <string>#include <map>#include <fstream>#include <bitset>using namespace std;typedef long long ll;int T;int R, C, K;int main() { //open files ifstream f_input; ofstream f_output; f_input.open("B-large-practice.in"); f_output.open("out_put"); f_input >> T; for (int tt = 1; tt <= T; tt++) { f_input >> R >> C >> K; vector<vector<char>> grid(R + 1, vector<char>(C + 1, 'O')); vector<vector<ll>> dp(R + 1, vector<ll>(C + 1, 0)); vector<vector<ll>> square(R + 1, vector<ll>(C + 1, 0)); vector< vector< pair<ll, ll> > > stretch(R + 1, vector< pair<ll, ll> >(C + 1, make_pair(0, 0))); for (int i = 0; i < K; i++) { int a, b; f_input >> a >> b; grid[a][b] = 'X'; } for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1]; if (grid[i - 1][j - 1] == 'X') { stretch[i][j] = make_pair(0, 0); square[i][j] = 0; } else { stretch[i][j] = make_pair(stretch[i][j - 1].first + 1, stretch[i - 1][j].second + 1); square[i][j] = min(min(stretch[i][j].first, stretch[i][j].second), square[i - 1][j - 1] + 1); dp[i][j] += square[i][j]; } } } f_output << "Case #" << tt << ": " << dp[R][C] << endl; cout << tt << " finished" << endl; } f_input.close(); f_output.close();}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 临潭县| 镇巴县| 德格县| 囊谦县| 莱西市| 柘荣县| 积石山| 河南省| 桐梓县| 刚察县| 陇川县| 金秀| 涿鹿县| 宜良县| 陆良县| 泰兴市| 海晏县| 滨州市| 密山市| 于田县| 莱阳市| 阿勒泰市| 定陶县| 清新县| 黔南| 化德县| 北安市| 扶余县| 浮梁县| 镇江市| 新闻| 汽车| 东明县| 深泽县| 连山| 揭东县| 花垣县| 邯郸市| 台中县| 上饶县| 泗水县|