HDU 4804 캠퍼스 디자인 윤곽선 dp
2487 단어 design
배우 면 간단 하 다 고 생각 합 니 다. 60 줄 이 안 되 는 코드 가 은상 과 의 만 남 을 놓 쳐 가슴 이 아 픕 니 다 ~
밑 에 코드 한 발 ~
#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdio>
#define mod 1000000007
#define maxn 100
#define maxm 10
using namespace std;
char color[maxn + 50][maxm + 5];
int dp[2][1 << (maxm+1)][25];
int n, m, c, d;
int main()
{
while (~scanf("%d%d%d%d", &n, &m, &c, &d))
{
for (int i = 0; i < n; i++) scanf("%s", color[i]);
memset(dp, 0, sizeof(dp));
dp[0][0][d] = 1;
int t = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
t = i*m + j;
memset(dp[(t + 1) & 1], 0, sizeof(dp[(t + 1) & 1]));
for (int k = 0; k < 1 << m; k++){
for (int r = 0; r <= d; r++){
if ((k >> j) & 1 || color[i][j] == '0'){
dp[(t + 1) & 1][k&~(1 << j)][r] = (dp[t & 1][k][r] + dp[(t + 1) & 1][k&~(1 << j)][r]) % mod;
}
else{
if (j + 1 < m && color[i][j + 1] == '1'&& !(k >> (j + 1) & 1)){
dp[(t + 1) & 1][k | (1 << (j + 1))][r] = (dp[t & 1][k][r] + dp[(t + 1) & 1][k | (1 << (j + 1))][r]) % mod;
}
if (i + 1 < n&&color[i + 1][j] == '1'){
dp[(t + 1) & 1][k | (1 << j)][r] = (dp[t & 1][k][r] + dp[(t + 1) & 1][k | (1 << j)][r]) % mod;
}
if (r > 0){
dp[(t + 1) & 1][k][r - 1] = (dp[t & 1][k][r] + dp[(t + 1) & 1][k][r - 1]) % mod;
}
}
}
}
}
}
int ans = 0;
for (int i = d - c; i >= 0; i--){
ans = (ans + dp[(t + 1) & 1][0][i]) % mod;
}
printf("%d
", ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
CSS 열 🎨텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.