UVA - 11258 String Partition

题目大意:给出一个字符串,由0~9组成,现在可以将字符串切割成若干段,每一段便可代表一个数值,但是这个数值不能大于int的最大上限,问,如何切割可以使得这若干个数的和最大。


解题思路:递推,dp[i]表示第i位数以前的最优解,由于int型数最多10位数,所以就可以枚举位数求解


#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
using namespace std;

int main() {
	int T;
	char s[210];
	scanf("%d%*c", &T);
	while (T--) {
		scanf("%s", s+1);
		int num[210][210] = {0};
		long long DP[210] = {0};
		int len = strlen(s+1); 
		for (int m = 1; m <= 10; m++)
			for (int i = 1, j = m; j <= len; j++, i++) {
				long long temp = 0;
				for (int k = i; k <= j; k++)
					temp = temp * 10 + s[k] - '0';
				num[i][j] = temp <= INT_MAX ? temp : 0;
			}

		for (int i = 1; i <= len; i++)
			for (int j = 1; j <= 10 && j <= i; j++)
				DP[i] = max(DP[i], DP[i-j] + num[i-j+1][i]);
		printf("%lld\n", DP[len]);
	}
	return 0;
}


你可能感兴趣的:(UVA - 11258 String Partition)