dp【区间规划】jzoj 1291

需要输出方案,总之就是麻烦一些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;
}
原文地址:https://www.cnblogs.com/Lazers/p/6524829.html