dp[i][j]: 从1到i这一段,有j个逗号,最后一个逗号的位置。
dp[i][j]=max(dp[k][j-1]),k<i.
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
char str[101];
int num[101];
int dp[101][101];
int bijiao(int x,int y,int xx,int yy)
{
if(y==0)return 1;
int i,j;
for(i=x;i<=y;i++)
{
if(num[i]!=0)break;
else x++;
}
for(j=xx;j<=yy;j++)
{
if(num[j]!=0)break;
else xx++;
}
int len1,len2;
len1=y-x;
len2=yy-xx;
if(len1>len2)return 0;
if(len1<len2)return 1;
for(i=x,j=xx;i<=y;i++,j++)
{
if(num[i]<num[j])return 1;
if(num[i]>num[j])return 0;
}
return 0;
}
void pri(int x,int len)
{
int nums[101];
int top=0;
int y=len;
int z=dp[y][x];
while(z!=1)
{
nums[top++]=z;
z=dp[z-1][x-1];
x--;
}
sort(nums,nums+top);
nums[top]=1001;
for(int i=1,j=0;i<=len;i++)
{
if(i==nums[j])
{
printf(",");
j++;
}
printf("%d",num[i]);
}
cout<<endl;
}
int main()
{
int k,i,j;
while(~scanf("%s",str))
{
int len=strlen(str);
for(i=0;i<len;i++)
{
num[i+1]=str[i]-'0';
}
num[0]=-1;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1;i<=len;i++)
{
for(j=1;j<=i;j++)
{
for(k=j-1;k<i;k++)
{
if(dp[k][j-1]==0)continue;
if(bijiao(dp[k][j-1],k,k+1,i))
dp[i][j]=max(dp[i][j],k+1);
}
}
}
int z=0;
for(i=1;i<=len;i++)
{
z=max(dp[len][i],z);
}
for(i=1;i<=len;i++)
{
if(dp[len][i]==z)
{
pri(i,len);
break;
}
}
}
}