题目的意思就是给你一大串数字.把他们分割成几个数字.每个数字不能超过int 就是 (1 << 31) - 1;
要求分割出来的数字和最大....
首先(1 << 31) - 1 是2147483648 是一个10位数,也就是我们最数字,最多只能切出一个10位数,而且如果太大,只能切9位..
那么我可以这样递归,
把第一个数字切出来..剩下的递归算,或者.
把前两个数字切出来..剩下递归.
...
把前九个数字切出来..剩下的递归.
如果切10位不会超,那么也可以.
然后取最大值..
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll LIMIT = ((ll)1 << 31) - 1;
const int N = 205;
char str[N];
int len;
ll f[N];
ll dp(int cur) {
if(f[cur] != -1)
return f[cur];
if(cur == len)
return f[cur] = 0;
if(str[cur] == '0')
return f[cur] = dp(cur + 1);
ll sum = 0;
for (int i = 0 ; i < 10 ;i++) {
if(cur + i >= len)
break;
sum = sum * 10 + str[cur + i] - '0';
if(sum > LIMIT)
break;
f[cur] = max(f[cur] , sum + dp(cur + i + 1));
}
return f[cur];
}
int main () {
int t;
scanf("%d",&t);
while(t--) {
memset(f, -1 ,sizeof(f));
scanf("%s",str);
len = strlen(str);
printf("%lld\n",dp(0));
}
}