返回题解分享
讨论 / 题解分享/ 帖子详情

接龙数列(编程题) - 题解

#### DP

#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;
}


dp[y]=max(dp[x]+1,dp[y]);
用于更新以数字 y 结尾的最长序列的长度

假设我们有一系列字符串,每个字符串由两个数字组成,我们的目标是找到一个最长的字符串序列,使得每个字符串的第一个数字等于前一个字符串的最后一个数字。

例如,我们有以下字符串序列:

"11" "121" "22" "12" "2023"


我们用 dp[i] 来表示以数字 i 结尾的最长序列的长度。初始时,所有的 dp[i] 都是0,因为我们还没有开始构建序列。

现在,我们开始处理每个字符串:

  1. 对于字符串 “11”,x=1, y=1。因为这是第一个字符串,所以我们将 dp[1] 更新为 dp[1]+1,即 dp[1]=1
  2. 接下来是 “121”,x=1, y=1。我们查看 dp[1],它是1,表示已经有一个长度为1的序列以1结尾。所以我们可以在这个序列后面加上 “121”,形成一个新的序列。因此,dp[1] 更新为 dp[1]+1,即 dp[1]=2
  3. 对于 “22”,x=2, y=2。查看 dp[2],它是0,所以 dp[2] 更新为 dp[2]+1,即 dp[2]=1
  4. 对于 “12”,x=1, y=2。查看 dp[1],它是2,所以 dp[2] 更新为 dp[1]+1,即 dp[2]=3
  5. 最后是 “2023”,x=2, y=3。查看 dp[2],它是3。所以 dp[3] 更新为 dp[2]+1,即 dp[3]=4

在这个过程中,m 用来记录我们找到的最长序列的长度。每次我们更新 dp[y] 时,我们都会检查它是否比 m 大。如果是,我们就更新 m

最终,dp 数组和 m 的值如下:

dp[1] = 2, dp[2] = 3, dp[3] = 4, 
m = 4


这意味着我们可以构建一个长度为4的序列,所以 n-m 就是我们需要从原始序列中移除的字符串数量,以便剩下的字符串可以形成这样一个最长序列。在这个例子中,n=5m=4,所以我们需要移除 5-4=1 个字符串。
0 回复 0 转发 7 喜欢 3 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!