当前位置: 代码迷 >> 综合 >> rqnoj-413-递增序列-dp
  详细解决方案

rqnoj-413-递增序列-dp

热度:29   发布时间:2023-12-19 10:59:29.0

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;}}}
}