以下是维特比算法的C语言实现:
```
#include <stdio.h>
#include <stdlib.h>
#define N 3 // 状态数
#define M 4 // 观测符号数
int main()
{
int i, j, t;
int obs_seq[] = {0, 1, 2, 0}; // 观测序列
double a[N][N] = {{0.5, 0.2, 0.3}, {0.3, 0.5, 0.2}, {0.2, 0.3, 0.5}}; // 转移概率矩阵
double b[N][M] = {{0.5, 0.5, 0.0, 0.0}, {0.0, 0.5, 0.5, 0.0}, {0.0, 0.0, 0.5, 0.5}}; // 发射概率矩阵
double pi[N] = {0.2, 0.4, 0.4}; // 初始状态概率
double delta[M][N]; // delta矩阵
int psi[M][N]; // psi矩阵
int q[M]; // 最优状态序列
// 初始化
for (i = 0; i < N; i++) {
delta[0][i] = pi[i] * b[i][obs_seq[0]];
psi[0][i] = 0;
}
// 递推
for (t = 1; t < M; t++) {
for (j = 0; j < N; j++) {
double max_delta = 0.0;
int max_i = 0;
for (i = 0; i < N; i++) {
double tmp_delta = delta[t - 1][i] * a[i][j] * b[j][obs_seq[t]];
if (tmp_delta > max_delta) {
max_delta = tmp_delta;
max_i = i;
}
}
delta[t][j] = max_delta;
psi[t][j] = max_i;
}
}
// 终止
double max_delta = 0.0;
int max_i = 0;
for (i = 0; i < N; i++) {
if (delta[M - 1][i] > max_delta) {
max_delta = delta[M - 1][i];
max_i = i;
}
}
// 回溯
q[M - 1] = max_i;
for (t = M - 2; t >= 0; t--) {
q[t] = psi[t + 1][q[t + 1]];
}
// 输出结果
printf("最优状态序列为:");
for (t = 0; t < M; t++) {
printf("%d ", q[t]);
}
printf("\n");
return 0;
}
```
其中,`a`数组为转移概率矩阵,`b`数组为发射概率矩阵,`pi`数组为初始状态概率,`obs_seq`数组为观测序列。程序中使用了`delta`和`psi`两个矩阵来辅助计算。最终,程序输出最优状态序列。