UVa 11212 편집 서적 편집 도서 교체 심화
이 문제 에서 n 의 범 위 는 1 에서 9 이기 때문에 검색 층수 의 범 위 는 1 에서 8 이다.
평가 함수 h () 는 이렇게 확 정 됩 니 다. 매번 잘라 내기 / 붙 여 넣 기 는 최대 세 개의 수의 후계 (독자 가 스스로 검증 할 수 있 습 니 다) 를 바 꿉 니 다. 즉, 한 층 을 검색 할 때마다 최대 세 개의 숫자의 후계 가 오류 에서 정확 해 지기 때문에 (maxd - 현재 층수) * 3 < 현재 오류 의 후계 수 는 가 지 를 잘라 야 합 니 다.
#include
#include
int a[30];
int kase = 1;
int n;
int hh()
{
int cur = 0;
for(int i = 1; i < n; i++)
if(a[i+1] != a[i] + 1) cur++;
if(a[n] != n) cur++;
return cur;
}
bool dfs(int cur, int maxd)
{
int h = hh();
if(cur == maxd) return h == 0;
if(cur < maxd) if(3*cur + h > 3*maxd + 1) return false;
int olda[30];
int b[30];
memcpy(olda, a, sizeof(a));
for(int i = 1; i <= n; i++) //
for(int j = i; j <= n; j++) //
{
int now = 1;
for(int k = 1; k <= n; k++)
if(k < i || k > j) b[now++] = a[k];
for(int d = 1; d <= now; d++) // a[i..j], b[1..now-1], a[i..j] b[1],b[2],..,b[now] 。
{
int now2 = 1;
int ii = i;
for(int p = d; p < d+j-i+1; p++) a[p] = olda[ii++];
for(int p = 1; p < d; p++) a[p] = b[now2++];
for(int p = d+j-i+1; ; p++)
{
//printf("p = %d i = %d j = %d n = %d
",p,i,j,n);
a[p] = b[now2++];
if(now2 > n-(j-i+1)) break;
}
if(dfs(cur+1, maxd)) return true; //
memcpy(a, olda, sizeof(a)); // a
}
}
return false;
}
int solve()
{
int maxd_max = 8;
for(int maxd = 0; maxd < 8; maxd++)
if(dfs(0, maxd)) return maxd;
return maxd_max;
}
int main()
{
//freopen("ztest.txt","r",stdin);
//freopen("zans.txt","w",stdout);
while(scanf("%d",&n) && n)
{
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
printf("Case %d: %d
", kase++, solve());
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
UVa 548 트리제목: 중순과 후순 서열을 제시하고 뿌리에서 잎사귀 결점까지의 경로와 값이 가장 작은 잎사귀 결점을 구한다.값과 같으면 잎사귀 결점 값이 비교적 작은 것을 선택하십시오. 사고방식: 중순과 후순 서열로 돌아가며 두 갈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.