6. 多矩陣相乘運算次數

namespace Q6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int n;
            if (!int.TryParse(textBox1.Text, out n)) return;
            label2.Text = $"請輸入m1~m{n}的矩陣大小<維度>:";

            panel1.Controls.Clear();
            for (int i = 0; i < n; i++)
            {
                var panel = new FlowLayoutPanel();
                panel.Width = panel1.Width;
                panel.Height = 25;
                var lbl = new Label();
                lbl.Text = $"m{i + 1}的矩陣大小: ";
                lbl.Width = 150;
                var tb1 = new TextBox();
                tb1.Width = 60;
                var tb2 = new TextBox();
                tb2.Width = 60;

                panel.Controls.Add(lbl);
                panel.Controls.Add(tb1);
                panel.Controls.Add(tb2);
                panel1.Controls.Add(panel);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            var s = new List<int>();
            for (int i = 0; i < panel1.Controls.Count; i++)
            {
                var p = panel1.Controls[i];
                s.Add(int.Parse(p.Controls[1].Text));
                if (panel1.Controls.Count - 1 == i) s.Add(int.Parse(p.Controls[2].Text));
            }

            var n = s.Count - 1;
            var dp = new int[n + 1, n + 1];
            var sp = new int[n + 1, n + 1];

            for (int l = 2; l <= n; l++)
            {
                for (int i = 1; i <= n - l + 1; i++)
                {
                    int j = i + l - 1;

                    dp[i, j] = int.MaxValue;
                    for (int k = i; k < j; k++)
                    {
                        var cost = dp[i, k] + dp[k + 1, j] +
                            s[i - 1] * s[k] * s[j];
                        if (cost < dp[i, j])
                        {
                            dp[i, j] = cost;
                            sp[i, j] = k;
                        }
                    }
                }
            }


            label3.Text = $"矩陣相乘的次序為: {p(sp, 1, n)}\n最少的乘法運算次數: {dp[1, n]}";
        }

        string p(int[,] sp, int i, int j)
        {
            if (i == j) return $"m{i}";

            var k = sp[i, j];
            return $"<{p(sp, i, k)} {p(sp, k + 1, j)}>";
        }
    }
}

AST

D&C

Last updated