1 条题解
-
0
对于这种接龙型问题,具体只关心两个数字的首位和末位,与具体数值大小无关,而获取的值就是接龙序列的最长长度,只需知道首位和上一末位相同则长度加一即可。
因此定义状态数组为dp[i]=x,表示以i结尾的接龙序列最长长度为x
#include<bits/stdc++.h> using namespace std; #define ll long long int N; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N; vector<int> dp(10, 0); //dp[i]:以i结尾的最长整数数列长度 int x; for (int i = 1; i <= N; i++) { cin >> x; int first = x; while (first >= 10)first /= 10;//获取首位的数字 int last = x % 10; //获取末尾的数字 //状态转移,当前数字可以接在以首位结尾的数字后面,也就是dp[first],长度加一 //或者不接在后面,自己作为一个长度 dp[last] = max(dp[first] + 1, dp[last]); } //最终结果是统计出最长的长度,接着用总长度减去最长的长度就是需要删除的长度 int maxlen = 0; for (int i = 0; i < 10; i++)maxlen = max(dp[i], maxlen); cout << N - maxlen << endl; return 0; }
信息
- ID
- 549
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 27
- 已通过
- 18
- 上传者