DP之石子合并

代码:

 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

猜你喜欢

转载自www.cnblogs.com/wangxuelin/p/9021178.html