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