用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有了几种不同的方式,他想知道沿途最多能看到多少棵树正在开花(走到一个点才能看见这个点的花是否开了,不能重复经过同一个点)。
时间: 2024-02-20 08:56:23 浏览: 145
c语言 显示一朵花
以下是用 C 语言实现的代码,使用了动态规划算法:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100001
int n, m;
int p[MAXN], f[MAXN], pre[MAXN][5], dp[MAXN][5][5];
void init() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &p[i]);
scanf("%d", &m);
}
inline int get_flower(int i, int z) {
if ((z >= 1 && z <= 3 && p[i] == 1) || (z == 3 && p[i] == 2)
|| (z == 4 && p[i] == 3) || (z >= 9 && z <= 10 && p[i] == 4))
return 1;
return 0;
}
int dfs(int i, int j, int k) {
if (dp[i][j][k] != -1) return dp[i][j][k];
if (i == j || i == k || j == k) return dp[i][j][k] = 0;
int ans = 0;
if (pre[i][j] != k) ans = dfs(pre[i][j], k, j) + get_flower(i, k);
if (pre[i][k] != j) ans = (ans > dfs(pre[i][k], j, k) + get_flower(i, j)) ? ans : dfs(pre[i][k], j, k) + get_flower(i, j);
return dp[i][j][k] = ans;
}
void solve() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 4; j++) {
f[i] = (f[i] > dfs(i, i % n + 1, (i + 1) % n + 1) + get_flower(i, j)) ? f[i] : dfs(i, i % n + 1, (i + 1) % n + 1) + get_flower(i, j);
}
}
for (int i = 1; i <= m; i++) {
int z, u, v, ans = 0;
scanf("%d%d%d", &z, &u, &v);
for (int j = 1; j <= 4; j++)
ans = (ans > f[u] + f[v] + dfs(u, v, u % n + 1) + get_flower(u, j) + get_flower(v, j) - dfs(u, v, u % n + 1)) ? ans : f[u] + f[v] + dfs(u, v, u % n + 1) + get_flower(u, j) + get_flower(v, j) - dfs(u, v, u % n + 1);
printf("%d\n", ans);
}
}
int main() {
init();
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
for (int k = i + 1; k < j; k++) {
if (dfs(i, k, j) + get_flower(i, j) > f[i]) {
f[i] = dfs(i, k, j) + get_flower(i, j);
pre[i][j] = k;
}
}
}
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= 4; j++)
for (int k = 1; k <= 4; k++)
dp[i][j][k] = -1;
solve();
return 0;
}
```
注:该代码仅供参考,可能并不是最优解。
阅读全文