用c语言实现:小明得知在沁湖边上有n个点,这几个点从1到n顺时针为国成一圈,每个点栽有一颗花树。有四种花树:梅花(花期1-3月系、樱花(花期3-4月)、石楠花(花期4-5月)、桂花(花期9-10月),每种花只在自己的花期开花。小明给每个点标记一个值p,p;的值表示该点是哪种花公 1代表梅花,2代表樱花,了代表石楠花,4代表桂花。小明现在制定了m种观赏方案,每次选定一个月份z,在江月去赏花,在由于沁湖太大,小明就选了湖边两个点u和v ,想着就欣赏从u到v沿途的花就好了,因为湖中有桥,现在他发现从u走到v有了几种不同的方式,他想知道沿途最多能看到多少棵树正在开花(走到一个点才能看见这个点的花是否开了,不能重复经过同一个点)。
时间: 2023-12-12 17:03:11 浏览: 136
c语言 显示一朵花
以下是用C语言实现的动态规划算法,可以参考一下。
```C
#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
#define MAXN 105
int n, m, z, u, v;
int p[MAXN];
int dp[MAXN][MAXN][15];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
scanf("%d%d%d%d%d", &n, &m, &z, &u, &v);
for (int i = 1; i <= n; i++) {
scanf("%d", &p[i]);
}
memset(dp, -INF, sizeof(dp));
for (int i = 1; i <= n; i++) {
dp[i][i][p[i]] = 0;
}
for (int len = 2; len <= n; len++) {
for (int i = 1; i+len-1 <= n; i++) {
int j = i+len-1;
for (int k = 1; k <= 12; k++) {
for (int mid = i; mid < j; mid++) {
dp[i][j][k] = max(dp[i][j][k], dp[i][mid][(k-1+12)%12+1] + dp[mid+1][j][k]);
}
}
}
}
int ans = -INF;
for (int k = 1; k <= 12; k++) {
ans = max(ans, dp[u][v][k]);
}
printf("%d\n", ans);
return 0;
}
```
输入格式为:第一行为n、m、z、u、v;第二行为n个数,表示每个点的花树类型。输出结果为沿途最多能看到的花树数量。
该程序的时间复杂度为O(n^3m),空间复杂度为O(n^3)。
阅读全文