

上台阶(CIE-C3-202212-4)
这里有一道问题,需要求解答,谢谢


核心特简单:一次能走1/2/3阶,所以n阶的走法数 = 走n-1阶 + n-2阶 + n-3阶。先把前3阶的数定死(1阶1种、2阶2种、3阶4种),后面套公式算就行。
#include <iostream>
using namespace std;
int main() {
int dp[51] = {0,1,2,4}; // dp[阶数]=走法数,直接初始化前3阶
for (int i=4; i<=50; i++) dp[i] = dp[i-1]+dp[i-2]+dp[i-3];
int n;
while (cin>>n && n) cout << dp[n] << endl; // 输入0就结束
return 0;
}
关键就一点:只翻单词本身,不管首尾/中间有多少空格,都原样保留。思路就是遍历字符串,遇到空格直接抄,遇到单词先抠出来翻转再拼回去。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s, res;
getline(cin, s); // 读整行(包含所有空格)
for (int i=0; i<s.size(); ) {
if (s[i] == ' ') { // 处理连续空格
int j=i;
while (j<s.size() && s[j]==' ') j++;
res += s.substr(i, j-i);
i=j;
} else { // 翻转单词
int j=i;
while (j<s.size() && s[j]!=' ') j++;
string word = s.substr(i, j-i);
reverse(word.begin(), word.end());
res += word;
i=j;
}
}
cout << res << endl;
return 0;
}
dp[i] = dp[i-1]+dp[i-2]+dp[i-3];