需要输出方案,总之就是麻烦一些0.0
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int f[2005][2005]; int a[2005]; int sum[2005]; int sumx[2005][2005]; string ff[2005][2005]; char struck[1000000]; int top=0; int n; void work() { for(int i=1;i<=n;i++) for(int u=i;u<=n;u++) { sumx[i][u]=sum[u]-sum[i-1]; } return ; } string ss(int b) { string a; while(b!=0) { a=char(b%10+'0')+a; b/=10; } return a; } int s(string s) { int k=0; for(int i=0;i<s.size();i++) { k=k*10+s[i]-'0'; } return k; } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;i++) ff[i][i]=ss(a[i]); work(); for(int p=1;p<=n;p++) for(int i=1;i<=n;i++) { int j=p+i-1; if(j>n)break; for(int k=j-1;k>=i;k--) { if(f[i][k]+f[k+1][j]+sumx[i][j]<f[i][j]||f[i][j]==0) { f[i][j]=f[i][k]+f[k+1][j]+sumx[i][j]; ff[i][j]='('+ff[i][k]+'+'+ff[k+1][j]+')'; } } } cout<<ff[1][n]<<endl; cout<<f[1][n]<<endl; string a=ff[1][n]; for(int i=0;i<a.size();i++) { struck[++top]=a[i]; if(struck[top]==')') { top--; int w=top; int kk=0; string str1,str2; while(struck[--top]!='('); for(int i=top+1;i<=w;i++) { if(struck[i]=='+') { kk=i;break; } str1=str1+struck[i]; } //cout<<i<<"+++";cout<<top<<endl; //cout<<str1<<endl; for(int i=kk+1;i<=w;i++) { str2=str2+struck[i]; } int num=s(str2)+s(str1); //cout<<str1<<"+++"<<str2<<endl; cout<<num<<' '; string xx=ss(num); top--; for(int i=0;i<xx.size();i++) { struck[++top]=xx[i]; } } } return 0; }