Codeforces 1287C Garland

제목 링크:Codeforces 1287C Garland 사고방식: 우리기dp[i][j][0]dp[i][j][1]는 각각 i개가 홀수/짝수이고 앞의 i개 안에 j개의 짝수가 있는 상황에서 i개의 최소 복잡도.첫 번째가 홀수/짝수일 때의 추이 관계를 쉽게 얻을 수 있다.i번째가 비어 있을 때 짝을 뽑아도 됩니다. 우리는 모두 가장 작은 짝을 추출하면 됩니다.최종 답은 전 n개의 짝수가 n/2개인 경우 [0][1]의 최소치를 취하는 것이다.코드:
#include

using namespace std;

const int maxn = 105;
int n, p[maxn], dp[maxn][maxn][2]; 
#define op(x,y) x = min(x, y)
int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);
#endif
	memset(dp, 127, sizeof(dp));
	dp[0][0][0] = dp[0][0][1] = 0;
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> p[i];
	for(int i = 1; i <= n; i++){
		for(int j = 0; j <= n / 2; j++){
			if(p[i] == 0 || p[i] % 2 == 0){
				op(dp[i][j + 1][0], dp[i - 1][j][0]);
				op(dp[i][j + 1][0], dp[i - 1][j][1] + 1);
			}
			if(p[i] == 0 || p[i] % 2){
				op(dp[i][j][1], dp[i - 1][j][1]);
				op(dp[i][j][1], dp[i - 1][j][0] + 1);
			}
		}
	}
	cout << min(dp[n][n / 2][0], dp[n][n / 2][1]);
	return 0;
}

좋은 웹페이지 즐겨찾기