UVA - 11258 String Partition

開始沒仔細考慮,看成了區間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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章