A.跳台阶
链接:https://www.nowcoder.com/acm/contest/90/A来源:牛客网
有一个n级台阶的楼梯,小明一次可以向上跳1步,两步,甚至是n步,请问小明跳到n级台阶有多少种跳法?
输入描述:
第一行输入一个整数t,代表有t组样例:( T<=30)接下来的t行,都用一个整数n,表示楼梯有n级台阶( 1<=n<=30)
输出描述:
输出跳到第n级台阶有多少种跳法
输入
1
1
输出
1
法1:无后效性,dp
#include <cstdio>
#include <iostream>
using namespace std;
int t,n;
int f[35];
int main(){
for (int i = 1;i <= 30;i++) f[i] = 1;
for (int i = 2;i <= 30;i++){
for (int j = 1;j < i;j++){
f[i] += f[j];
}
}
scanf("%d",&t);
for (int i = 0;i < t;i++){
scanf("%d",&n);
printf("%d\n",f[n]);
}
return 0;
}
法2:每个台阶可以选择走或者跳过(不走该层),n层台阶有2^(n-1)种走法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
printf("%lld\n",(ll)pow(2.0,n-1));
}
return 0;
}
D.psd面试
求除去最长回文子序列后还有多少字母(忽略大小写)
输入
输出
2
输入
aBc,bAd
输出
2
思路:
动态规划思想
对于任意字符串,如果头尾字符相同,那么字符串的最长子序列等于去掉首尾的字符串的最长子序列加上首尾;如果首尾字符不同,则最长子序列等于去掉头的字符串的最长子序列和去掉尾的字符串的最长子序列的较大者。
因此动态规划的状态转移方程为:
设字符串为str,长度为n,p[i][j]表示第i到第j个字符间的子序列的个数(i<=j),则:
状态初始条件:dp[i][i]=1 (i=0:n-1)
状态转移方程:dp[i][j