代码:(参考最长上升子序列)50%DP例题详解-数字三角形,最长上升子序列,最长公共子序列-CSDN博客
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int f[N];
int l[N], r[N];
int n;
int main()
{
cin >> n;
char num[20];
for(int i=0;i<n;i++)
{
scanf("%s", num);
l[i] = num[0] - '0', r[i] = num[strlen(num) - 1] - '0';
}
int ans = 1;
for(int i=0;i<n;i++)
{
f[i] = 1;
for(int j=0;j<i;j++)
{
if(r[j] == l[i]) //类比LIS即可
f[i] = max(f[i], f[j] + 1);
}
ans = max(ans, f[i]);
}
cout << n - ans;
return 0;
}
100%
#include <iostream>
#include <string>
using namespace std;
int dp[10];
int main()
{
// 请在此输入您的代码
int n;
cin>>n;
string s;
int m=0;
for(int i=0;i<n;i++){
cin>>s;
int x=s[0]-'0',y=s[s.size()-1]-'0';//第一位和最后一位
dp[y]=max(dp[x]+1,dp[y]);
m=max(m,dp[y]);
}
cout<<n-m<<endl;
return 0;
}