国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表

圖片精選

主站蜘蛛池模板: 天镇县| 巴彦淖尔市| 侯马市| 南部县| 龙游县| 金塔县| 临清市| 康马县| 泰兴市| 旌德县| 象山县| 镇康县| 北宁市| 雅江县| 宜丰县| 麻江县| 山阳县| 易门县| 大同市| 东光县| 曲靖市| 双江| 清流县| 巧家县| 金塔县| 林周县| 肥乡县| 池州市| 福建省| 奉化市| 手机| 拜城县| 息烽县| 建阳市| 芦山县| 临海市| 开平市| 遵义市| 北流市| 武安市| 蒙阴县|