dp[x]表示1-x的划分最大和,最多从前面10个位置转移过来
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <sstream> #define ll long long #define MAX_INT 2147483647 using namespace std; int n,l; string s; ll dp[210],num[210][210]; ll DP(int x){ if(x<=9&&num[0][x]<=MAX_INT) return num[0][x]; if(dp[x]!=-1) return dp[x]; ll ret=0; for(int i=x-9;i<=x;i++){ if(num[i][x]<=MAX_INT) ret=max(ret,DP(i-1)+num[i][x]); } return dp[x]=ret; } int main(){ //freopen("11258","r",stdin); scanf("%d",&n); getchar(); for(int i=0;i<n;i++){ getline(cin,s); memset(dp,0,sizeof dp); l=s.length(); for(int i=0;i<l;i++){ for(int j=i;j<l;j++){ num[i][j]=s[j]-'0'; for(int k=i+1;k<=j;k++){ num[i][k]=num[i][k-1]*10+s[k]-'0'; } } } for(int i=0;i<9;i++) dp[i]=num[0][i]; for(int i=9;i<l;i++){ for(int j=i-9;j<=i;j++){ if(num[j][i]<=MAX_INT) dp[i]=max(dp[i],dp[j-1]+num[j][i]); } } printf("%lld ",dp[l-1]); } return 0; }