使用C语言完成: 游戏规则是这样的:如上图所示所有的小球都布局在一行上,每个小球都有自己的颜色,连续摆放的同颜色小球构成一个小球片段,上图中共有14个小球片段,每个小球片段分别有:5、2、1、2、1、1、1、2、1、1、1、1、1、1个小球片段,玩家每次点击一个小球,则该小球所在的小球片段就会消失。若消失的小球片段中共有m个小球,则玩家获得m*m个积分。请问:给定游戏开始时的状态,玩家可获得的最高积分是多少?
时间: 2023-12-28 09:20:56 浏览: 23
以下是使用动态规划求解的C语言代码,时间复杂度为O(n^3):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
#define INF 0x3f3f3f3f
int n;
int a[MAX_N];
int dp[MAX_N][MAX_N];
int max(int a, int b) {
return a > b ? a : b;
}
int dfs(int l, int r) {
if (dp[l][r] != -1) {
return dp[l][r];
}
if (l == r) {
return dp[l][r] = a[l] * a[l];
}
int res = 0;
for (int i = l; i < r; i++) {
res = max(res, dfs(l, i) + dfs(i+1, r));
}
for (int i = l+1; i < r; i++) {
if (a[i] == a[l] && a[i] == a[r]) {
res = max(res, dfs(l+1, i-1) + dfs(i, r-1) + a[l] * a[i] * a[r]);
}
}
return dp[l][r] = res;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
memset(dp, -1, sizeof(dp));
printf("%d\n", dfs(0, n-1));
return 0;
}
```
其中,dp[i][j]表示消除区间[i, j]内的小球能够得到的最高积分。当i=j时,dp[i][j]=a[i]*a[i];当i<j时,dp[i][j]=max(dp[i][k]+dp[k+1][j]),其中i<=k<j。在这个基础上,还需要考虑消除区间[i, j]内的部分小球可以和边界上的小球构成更大的小球片段的情况,即dp[i][j]=max(dp[i][j], dp[i+1][k-1]+dp[k][j-1]+a[i]*a[k]*a[j]),其中i+1<=k<=j-1,a[i]=a[k]=a[j]。
最终,dp[0][n-1]即为所求的最高积分。