酷代码 AI
菜单

现在有n个数(n < 100),乌拉乎想知道以每个数作为终点,有多少个连续上升的数。 请你编写一个程序帮助他完成吧。

这是一个经典的动态规划问题。 我们需要对每个位置 `i`,计算以 `a[i]` 为结尾的最长连续上升子序列的长度(注意是“连续”,即子数组,不是子序列),但题目问的是“有多少个连续上升的数”,结合语境,实际意思是:以每个数为终点,有多少个连续上升子数组(即连续递增段)以它结束? 更准确理解题意: - 连续上升:指一段下标连续的子数组,满足 `a[j] < a[j+1] < ... < a[i]` - 以 `a[i]` 为终点:即子数组右端点是 `i` - “有多少个”:即统计以 `i` 结尾的连续上升子数组的个数 例如:`[1, 3, 2, 4]` - i=0: `[1]` → 1 个 - i=1: `[3]`, `[1,3]` → 2 个(因为 1<3) - i=2: `[2]` → 1 个(因为 3>2,不能接前面) - i=3: `[4]`, `[2,4]` → 2 个(因为 2<4,可接以 2 结尾的上升段;但 3>2,所以不能从 i=1 直接连) 关键观察: - 每个位置 `i` 至少有 1 个:单元素 `[a[i]]` - 如果 `a[i-1] < a[i]`,那么所有以 `i-1` 结尾的连续上升子数组,后面添上 `a[i]`,就变成以 `i` 结尾的新上升子数组 - 所以:`dp[i] = 1 + (dp[i-1] if a[i-1] < a[i] else 0)` ✅ 这正是标准解法:`dp[i]` 表示以 `i` 结尾的连续上升子数组个数 递推式: - `dp[0] = 1` - `dp[i] = dp[i-1] + 1`,当 `a[i-1] < a[i]` - `dp[i] = 1`,当 `a[i-1] >= a[i]` > ✅ 验证例子 `[1,3,2,4]`: > - dp[0] = 1 > - dp[1]: 1<3 → dp[0]+1 = 2 > - dp[2]: 3>2 → 1 > - dp[3]: 2<4 → dp[2]+1 = 2 > 输出:`[1, 2, 1, 2]` —— 正确 下面是 C++ 实现(也可轻松转 Python/Java): ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } vector<int> dp(n, 1); // dp[i] 表示以 a[i] 结尾的连续上升子数组个数 for (int i = 1; i < n; i++) { if (a[i-1] < a[i]) { dp[i] = dp[i-1] + 1; } } // 输出每个位置的答案 for (int i = 0; i < n; i++) { cout << dp[i]; if (i < n-1) cout << " "; } cout << endl; return 0; } ``` 输入样例: ``` 4 1 3 2 4 ``` 输出样例: ``` 1 2 1 2 ``` 如需 Python 版本或解释逻辑细节,可随时提出。 [2026-02-03 17:29:52 | AI问答 | 885点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多