#include <stdio.h>
#include <string.h>
// 计算RNA二级结构的最小自由能
int minimumFreeEnergy(char rna[], int n) {
int dp[n][n]; // 动态规划数组
memset(dp, 0, sizeof(dp)); // 初始化dp数组为0
for (int len = 3; len < n; len++) {
for (int i = 0; i < n - len; i++) {
int j = i + len;
if ((rna[i] == 'A' && rna[j] == 'U') || (rna[i] == 'U' && rna[j] == 'A') ||
(rna[i] == 'C' && rna[j] == 'G') || (rna[i] == 'G' && rna[j] == 'C')) {
dp[i][j] = dp[i + 1][j - 1] + 1;
}
for (int k = i; k < j; k++) {
if (dp[i][j] < dp[i][k] + dp[k + 1][j]) {
dp[i][j] = dp[i][k] + dp[k + 1][j];
}
}
}
}
return dp[0][n - 1];
}
int main() {
char rna[] = "ACGUAUCG";
int n = strlen(rna);
int minFreeEnergy = minimumFreeEnergy(rna, n);
printf("Minimum Free Energy: %d\n", minFreeEnergy);
return 0;
}