您的位置:首页 > 其它

uva 348 (矩阵链乘 打印路径)

2015-03-13 22:28 323 查看
题意:

求矩阵链乘最小值,并打印路径。

解析:

状态转移方程:dp[ i ] [ j ] = min(dp[ fr ] [ k ] + dp[ k + 1 ] [ to ] + x[fr] * y[k] * x[to]

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>

#define LL long long

using namespace std;
const int maxn = 10 + 10;
const int inf = 0x3f3f3f3f;

int x[maxn], y[maxn];
int dp[maxn][maxn];
int path[maxn][maxn];

int dfs(int fr, int to)
{
int& res = dp[fr][to];
if (res != -1)
return res;
path[fr][to] = fr;
if (fr == to)
return res = 0;
res = inf;
for (int k = fr; k < to; k++)
{
int t = dfs(fr, k) + dfs(k + 1, to) + x[fr] * y[k] * y[to];
if (t < res)
{
res = t;
path[fr][to] = k;
}
}
return res;
}

void print_path(int fr, int to)
{
if (to < fr)
return;
if (fr == to)
{
printf("A%d", fr + 1);
}
else
{
printf("(");
print_path(fr, path[fr][to]);
printf(" x ");
print_path(path[fr][to] + 1, to);
printf(")");
}
}

int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int n;
int ca = 1;
while (scanf("%d", &n) && n)
{
for (int i = 0; i < n; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
memset(dp, -1, sizeof(dp));
dfs(0, n - 1);
printf("Case %d: ", ca++);
print_path(0, n - 1);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: