给定一个数字串,请你插入若干个逗号,使得该数字串成为一个严格递增的数列且最后一个数要尽可能小,在这个问题中,前导的零是允许出现在数的前面的。
标签:cstring str cti char time ios amp 长度 include
输入数据仅含一行,为一个长度不超过 80 的数字串。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #include<stack> #include<ctime> #include<vector> using namespace std; int n,dp[120],f[120],ans[120],cnt; char s[120]; int cmp(int l,int r,int ll,int rr) { while(s[l]==‘0‘&&l+1<=r)l++; while(s[ll]==‘0‘&&ll+1<=rr)ll++; int len1=r-l+1,len2=rr-ll+1; if(len1>len2)return 1; else if(len1<len2)return -1; else { while(l+1<=r&&ll+1<=rr&&s[l]==s[ll]) { l++; ll++; } if(s[l]>s[ll])return 1; if(s[l]<s[ll])return -1; } return 0; } int main() { int i,j; scanf("%s",s); n=strlen(s); dp[0]=0; for(i=1; i<n; i++) { for(j=i-1; j>=0; j--) { if(cmp(dp[j],j,j+1,i)<0) { dp[i]=j+1; break; } } } f[dp[n-1]]=n-1; int k=dp[n-1]-1; while(s[k]==‘0‘) { f[k]=n-1; k--; } for(i=k; i>=0; i--) { for(j=dp[n-1]; j>=i+1; j--) { if(cmp(i,j-1,j,f[j])<0) { f[i]=j-1; break; } } } i=0; while(1) { int l=i; i=f[i]; for(j=l;j<=i;j++) cout<<s[j]; i++; if(i==n)break; cout<<‘,‘; } return 0; }
标签:cstring str cti char time ios amp 长度 include
原文地址:http://www.cnblogs.com/huangdalaofighting/p/7000524.html