开始没仔细考虑,看成了区间dp,这样复杂度会到十的七次方,果断超时,后来才发现,可以直接线性dp,从前向后do即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAX 210
#define BOD 2147483647
using namespace std;
char s[MAX];
long long len,dp[MAX];
void init(){
len=strlen(s);
memset(dp,-1,sizeof(dp));
dp[0]=s[0]-'0';
}
long long value(int front,int rear){
long long ret=0;
for(int i=front;i<=rear;i++)
ret=ret*10+s[i]-'0';
return ret;
}
int main(){
int T;
scanf("%d",&T);
getchar();
while(T--){
scanf("%s",s);
init();
for(int i=1;i<len;i++){
for(int l=1;l<=10&&i-l+1>=0;l++){
long long x=value(i-l+1,i);
if(x>2147483647LL)
continue;
dp[i]=max(dp[i],(i-l>=0?dp[i-l]:0)+x);
}
}
printf("%lld\n",dp[len-1]);
}
return 0;
}