刚开始以为最长子序列的做法,然后发现数据太大了,只能得四十分,遂看题解,寻找AC做法
四十分做法
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int dp[100010];
int n;
string s;
int head[100010],tail[100010];int main()
{cin>>n;int maxs=1; for(int i=1;i<=n;i++){cin>>s;head[i]=s[0]-'0';tail[i]=s[s.size()-1]-'0';}dp[1]=1;for(int i=2;i<=n;i++){for(int j=1;j<i;j++)if(head[i]==tail[j])dp[i]=max(dp[i],dp[j]+1);maxs=max(maxs,dp[i]); }cout<<n-maxs;return 0;
}
AC做法
核心就是一个数能否接龙是由它的自身第一个数字决定的,所以用dp[i]代表以i为结尾的数的最长接龙长度
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int dp[20];
int n;
string s;int main()
{cin>>n;for(int i=0;i<n;i++){cin>>s;dp[s.back()-'0']=max(dp[s.back()-'0'],dp[s.front()-'0']+1);}int maxs=-1e9;for(int i=0;i<10;i++) maxs=max(maxs,dp[i]);cout<<n-maxs;return 0;
}