题目链接:传送门
题目大意:略;
题目思路:DP思想
读入数据后,从后向前遍历,假如我们是要找一个长度为n的以1开头的数字串的所有序列,那么可以将它表示为1+(任意数开头的长度为n-1的序列)
然后我们要看序列中哪些子串没有出现过,也就是(任意数开头的长度为n-1的序列)中没有出现的子串,用dp数组可以理解为 当dp[i]=x是,所有1~q的dp数组都应该大于等于x-1
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <cctype> #include <queue> #include <string> #include <vector> #include<functional> #include <set> #include <map> #include <climits> #define lson root<<1,l,mid #define rson root<<1|1,mid+1,r #define fi first #define se second #define ping(x,y) ((x-y)*(x-y)) #define mst(x,y) memset(x,y,sizeof(x)) #define mcp(x,y) memcpy(x,y,sizeof(y)) using namespace std; #define gamma 0.5772156649015328606065120 #define MOD 1000000007 #define inf 0x3f3f3f3f #define N 100005 #define maxn 100005 typedef pair<int,int> PII; typedef long long LL; int n,vis[20],k; int dp[11]; int a[100005]; int main(){ int i,j,group; scanf("%d%d",&n,&k); for(i=1;i<=n;++i){scanf("%d",&a[i]);} for(i=n;i>=1;--i){ int m=inf; for(j=1;j<=k;++j) m=min(m,dp[j]); dp[a[i]]=m+1; } int m=inf; for(i=1;i<=k;++i)m=min(m,dp[i]); printf("%d ",m+1); return 0; }