51nod 1720 祖玛
这又是一个区间 dp,但这题又和其他的不一样,这题又用记忆化搜索,但是多学一种方法也没事,但其实用搜索后就模拟即可了。
#include<bits/stdc++.h> using namespace std; // 定义全局变量 int n; // 数组长度 int dp[505][505]; // dp[l][r] 表示在区间 [l, r] 之间的最优解 int a[1005]; // 存储输入的数组 // dfs 函数使用动态规划和递归来计算区间 [l, r] 的最小值 int dfs(int l, int r) { // 基本情况:如果左边界超过右边界,返回 1 if (l > r) { return 1; } // 如果 dp[l][r] 已经被计算过,直接返回结果 if (dp[l][r]) { return dp[l][r]; } // 初始化 dp[l][r] 为一个很大的值,表示我们要找到最小值 dp[l][r] = INT_MAX; // 枚举区间的分割点 i,将区间分为 [l, i] 和 [i+1, r] 两个部分 for (int i = l; i < r; i++) { // 递归计算两部分的值,并更新最小值 dp[l][r] = min(dp[l][r], dfs(l, i) + dfs(i + 1, r)); } // 如果数组的左右边界元素相等,可以尝试通过减少一层区间来优化结果 if (a[l] == a[r]) { dp[l][r] = min(dp[l][r], dfs(l + 1, r - 1)); } // 返回在区间 [l, r] 的最优解 return dp[l][r]; } int main() { ios::sync_with_stdio(false); // 关闭同步以提高输入输出效率 // 输入数组的长度 cin >> n; // 输入数组元素,从下标 1 到 n for (int i = 1; i <= n; i++) { cin >> a[i]; } // 调用 dfs 函数求解区间 [1, n] 的最优值,并输出结果 cout << dfs(1, n); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」