酷代码 AI
菜单
服务商

C++ 运用动态规划与双重循环枚举给定数组的所有非递减子序列(附代码)

这是一个经典的动态规划问题,可以使用双重循环来解决。以下是一个C++的解决方案: ```cpp #include <iostream> #include <vector> using namespace std; vector<vector<int>> allSubseq(vector<int>& nums) { vector<vector<int>> dp(nums.size() + 1, vector<int>(nums.size() + 1, 0)); for (int i = 1; i <= nums.size(); i++) { for (int j = 1; j <= nums.size(); j++) { dp[i][j] = dp[i - 1][j]; if (nums[i - 1] <= nums[j - 1]) { dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1); } } } vector<vector<int>> res; for (int i = 1; i <= nums.size(); i++) { for (int j = 1; j <= nums.size(); j++) { if (dp[i][j] == i) { vector<int> subseq; for (int k = i; k >= 1; k--) { subseq.push_back(nums[k - 1]); if (dp[k][j] != dp[k - 1][j]) { break; } } reverse(subseq.begin(), subseq.end()); res.push_back(subseq); } } } return res; } int main() { vector<int> nums = {1, 2, 3, 4, 5}; vector<vector<int>> res = allSubseq(nums); for (auto subseq : res) { for (auto num : subseq) { cout << num << " "; } cout << endl; } return 0; } ``` 这个程序首先创建了一个二维数组dp,其中dp[i][j]表示前i个元素中最大的非递减子序列的长度。然后,程序遍历dp数组,如果nums[i - 1] <= nums[j - 1],那么dp[i][j]就等于dp[i - 1][j - 1] + 1,否则dp[i][j]就等于dp[i - 1][j]。 程序遍历dp数组,如果dp[i][j]等于i,那么就找到了一个非递减子序列,程序将其添加到结果列表中。 ######[AI写代码神器 | 523点数解答 | 2023-11-09 00:49:15]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]