代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn=100; 8 9 void MinNum(int n,int p[],int m[maxn][maxn],int s[maxn][maxn]) 10 { 11 for(int i=2;i<=n;i++) 12 p[i]=p[i]+p[i-1]; 13 for(int i=1;i<=n;i++) m[i][i]=0; 14 for(int len=1;len<n;len++) 15 { 16 for(int i=1;i<=n-len;i++) 17 { 18 int j=i+len; 19 m[i][j]=m[i][i]+m[i+1][j]; 20 s[i][j]=i; 21 for(int k=i;k<j;k++) 22 { 23 int t=m[i][k]+m[k+1][j]; 24 if(t<m[i][j]) 25 { 26 m[i][j]=t; 27 s[i][j]=k; 28 } 29 } 30 m[i][j]=m[i][j]+p[j]-p[i-1]; 31 } 32 } 33 } 34 35 void MaxNum(int n,int p[],int m[maxn][maxn],int s[maxn][maxn]) 36 { 37 //for(int i=2;i<=n;i++) 38 // p[i]=p[i]+p[i-1]; 39 for(int i=1;i<=n;i++) m[i][i]=0; 40 for(int len=1;len<n;len++) 41 { 42 for(int i=1;i<=n-len;i++) 43 { 44 int j=i+len; 45 m[i][j]=m[i][i]+m[i+1][j]; 46 s[i][j]=i; 47 for(int k=i;k<j;k++) 48 { 49 int t=m[i][k]+m[k+1][j]; 50 if(t>m[i][j]) 51 { 52 m[i][j]=t; 53 s[i][j]=k; 54 } 55 } 56 m[i][j]=m[i][j]+p[j]-p[i-1]; 57 } 58 } 59 } 60 61 62 void show(int i,int j,int s[maxn][maxn]) 63 { 64 if(i==j) return; 65 show(i,s[i][j],s); 66 show(s[i][j]+1,j,s); 67 cout<<"A"<<i<<"+"<<"A"<<s[i][j]<<" "; 68 cout<<"A"<<s[i][j]+1<<"+"<<"A"<<j<<endl; 69 } 70 71 int main() 72 { 73 int n; 74 int p[maxn]={0,4,4,5,9}; 75 //cin>>n; 76 n=4; 77 78 //for(int i=1;i<=n;i++) 79 // cin>>p[i]; 80 int m[maxn][maxn],s[maxn][maxn]; 81 82 MinNum(n,p,m,s); 83 cout<<m[1][n]<<endl; 84 show(1,n,s); 85 MaxNum(n,p,m,s); 86 cout<<m[1][n]<<endl; 87 show(1,n,s); 88 }
输入示例:
4
4 4 5 9
输出示例:
43
A1+A1 A2+A2
A1+A2 A3+A3
A1+A3 A4+A4
54
A3+A3 A4+A4
A2+A2 A3+A4
A1+A1 A2+A4