백준

[백준 22983 ] 조각 체스판

케굴 2021. 10. 4. 21:13
#include <bits/stdc++.h> 
#define FASTIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 987654321
using namespace std;

int row[3001][3001];
int col[3001][3001];
int dp[3001][3001];
int board[3001][3001];
int N, M;

int main() {
	cin >> N >>M;
	FASTIO;
	//입력
	string str ="";
	for (int i = 0; i < N; i++) {
		cin >> str;
		for (int j = 0; j < M; j++) {
			if (str[j] == 'B') {
				board[i][j] = 0;
			}
			else if(str[j] == 'W'){
				board[i][j] = 1;
			}
			dp[i][j] = 1;
			
			row[i][j] = 0;
			col[i][j] = 0;
		}
	}
	//ROW COL 값 계산
	for (int i = 1; i < N; i++ ) {
		for (int j = 1; j < M; j++) {
			if (board[i][j] != board[i][j - 1])
				row[i][j] = row[i][j - 1] + 1;
			else
				row[i][j] = 0;
			if (board[i][j] != board[i - 1][j ])
				col[i][j] = col[i-1][j] + 1;
			else
				col[i][j] = 0;
		}
	}
	//DP 결과 계산 
	long long  ans =0;
	for (int i = 1; i < N; i++) {
		for (int j = 1; j < M; j++) {
			if (board[i][j] == board[i - 1][j - 1]) {
				//cout << i << " " << j << "\n";
				dp[i][j] = min({ dp[i - 1][j - 1], row[i][j], col[i][j] });
				dp[i][j]++;	
			}
			else
				dp[i][j] = 1;
				
			ans += dp[i][j];
		}
	}
	cout << ans + N + M - 1;	
}

결과를 int로 했더니 틀려서 longlong으로 바꿔서 성공했다.

 

 다이나믹 프로그래밍은 코딩은 쉬운데 발상이 너무 어렵고 힘들다 ..

너무 힘든 문제였다  ..