一、https://www.lanqiao.cn/problems/3512/learning/
解题步骤:1.dp[i]表示以i结尾最长接龙数列长度
2.每读入一个数字x...y,关注头尾的x,y来更新dp[y]
3.dp【y】= max(dp【y】,dp【x】+1):如果当前数字接在以x结尾数列后(dp【x】+1)的长度 大于 不加当前数字的以y结尾数列长度,则更新dp【y】。
4.求出最长接龙数列,最小删减数等于 N-max_len
#include <bits/stdc++.h>
using namespace std;
int dp[100010];
int main()
{
int N;
cin >> N;
int x=N;
string s;
int ans=0;
while(x--){
cin >> s;
int x=s[0]-'0',y= s[s.size()-1]-'0';
dp[y] = max(dp[x]+1,dp[y]);
ans = max(dp[y],ans);
}
cout << N-ans;
return 0;
}
二、最大上升子序列
步骤:1.dp[i]表示以i结尾的最大上升子序列的长度
2.初始化dp【i】=1
3.状态转移方程:如果num[j]<num[i],dp[i] = max(num[j]+1,dp[i])
for(int i=0; i<n; i++)
dp[i] = 1;
for(int j=0; j<i; j++)
{
if(num[j]<num[i]) dp[i]=max(dp[j]+1,dp[i])
max_len = max(max_len,dp[i]);
}