ZOJ 1602 Multiplication Puzzle

还是水题。

状态转移方程:dp(i,j)=min{dp(i,k)+dp(k,j)+a[i]a[j]a[k]}(i<k<j)。处理时注意边界即可。

贴代码:

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int d[101][101],a[101];
 5 int dp(int i,int j)
 6 {
 7     int &ans = d[i][j];
 8     int k,temp;
 9     if(ans != -1)
10         return ans;
11     if(i == j - 1)
12     {
13         ans = 0;
14         return ans;
15     }
16     if(i == j - 2)
17     {
18         ans = a[i] * a[i + 1] * a[j];
19         return ans;
20     }
21     ans = 0xffffff;
22     for(int k = i + 1;k < j;k++)
23     {
24         temp = dp(i,k) + dp(k,j) + a[i] * a[k] * a[j];
25         if(temp < ans)
26             ans = temp;
27     }
28     return ans;
29 }
30 int main()
31 {
32     int n,i;
33     while(cin>>n)
34     {
35         memset(d,-1,sizeof(d));
36         for(i = 1;i <= n;i++)
37             cin>>a[i];
38         int ans = dp(1,n);
39         cout<<ans<<endl;
40         /*for(int i = 1;i <= n;i++)
41         {
42             for(int j = 1;j <= n;j++)
43             {
44                 cout<<dp(i,j)<<"  ";
45             }
46             cout<<endl;
47         }*/
48     }
49     return 0;
50 }

 

posted @ 2012-04-11 18:14  浙西贫农  阅读(165)  评论(0编辑  收藏  举报