poj 1239dp(Increasing Sequences로 분할)
사고방식: 다음 dp로 가서 마지막 숫자의 최시간이 얼마인지 구하면 이 dp는 비교적 이해하기 쉽다. dp[i]는str[0~i]라는 꼬리가 마지막 하위 꼬리의 최시간 마지막 꼬리를 만족시키는 것을 나타낸다. 즉str[dp[i]~i]가 마지막 꼬리이다.이어서 앞으로 두 번째 dp에서 마지막 숫자가 가장 적은 상황에서 앞의 열을 최대한 크게 충족시킬 것을 구한다.여기에는 0에 대한 처리에 주의해야 한다.
#include <cstdio>
#include <cstring>
#define max(a,b) ((a)>(b)?(a):(b))
#define N 85
char str[N],dp[N],p[N],len;
int cmp(int a,int b,int c){// str[a,b-1] str[b,c]
int i=a,j=b;
while(i<b-1 && str[i]=='0')
i++;
while(j<c && str[j] == '0')
j++;
if(b-i < c-j+1)
return -1;
else if(b-i > c-j+1)
return 1;
for(;i<b;i++,j++){
if(str[i] < str[j])
return -1;
else if(str[i]>str[j])
return 1;
}
return 0;
}
int zero(int len){
int i;
for(i = len;i>=0;i--){
if(str[i] != '0')
return i;
p[i] = strlen(str)-1;// 0
}
return -1;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%s",str) && strcmp(str, "0")){
int i,j;
len = strlen(str);
dp[0] = 0;
for(i = 1;i<len;i++){// dp
for(j = i;j>0;j--)//
if(cmp(dp[j-1],j,i)<0)
break;
dp[i] = j;
}
p[dp[len-1]] = len-1;
len = dp[len-1];// ( )
if((j=zero(len-1)) && j==-1){// 0( 0 )
printf("%s
",str);
continue;
}
for(i = j;i>=0;i--)
for(j = len;j>i;j--)//
if (cmp(i, j, p[j])<0) {
p[i] = j-1;
break;
}
for(i = j = 0;i<strlen(str);i++){//
if(i<=p[j])
putchar(str[i]);
if(i==p[j] && i!=strlen(str)-1){
j = i+1;
putchar(',');
}
}
printf("
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.