递推求解:
N阶楼梯上楼问题。一次可走一阶或两阶,问有多少种上楼方式。
这同时也是裴波那契数列问题,当N>2时,走最后一次有两种情况,分从N-1到N和N-2到N,则F(N)=F(N-1)+F(N-2)。
错排问题:
错排公式为F(N)=(N-1)*F(N-1)+(N-1)*F(N-2),N个信封,N个信,N个信封中的信全部装错的种类。
错排公式为F(N)=(N-1)*F(N-1)+(N-1)*F(N-2),N个信封,N个信,N个信封中的信全部装错的种类。
动态规划:
最长递增子序列(LIS):
//dp
int num[51]; //整个序列
int dp[51]; //存储了每个数字之前的最长递增子序列长度
for(i=1;i<50;i++){
nmax=1; //每个最小是1
for(j=1;j<i;j++){ //遍历之前所有数字
if(a[j]<a[i])
nmax=max(nmax,dp[j]+1); //若dp[j]+1大于当前最长子序列,更新
}
dp[i]=nmax; //遍历完一个数字之前的序列,把最大长度存入
}
//之后最大值其实和最后一个dp相等
//
char s1[101],s2[101]; //两个字符串
int dp[101][101]; //存最长公共子序列长度
for(i=0;i<101;i++)
dp[i][0]=0;
for(j=0;j<101;j++)
dp[0][j]=0;
for(i=0;i<101;i++){
for(j=0;j<101;j++){ //用二重循环求得每个dp[][]的值
if(s1[i]!=s2[j]) //如果两个字符不等
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
else
dp[i][j]=dp[i-1][j-1]+1; //若它们相等,则加一
}
}