题意:
给定一串长度=n,数字大小<=m的正数序列。
问最短的不属于该序列子串的串长度为多少。这个串的数字都<=m。
思路:
说是dp,我觉得本质其实所找规律。
拿范例来说。
前8个数字已经使1,2,3,4,5都至少出现一次。
所以前8个数字可以归为一个集合。
然后再发现后6个数字也是1,2,3,4,5都至少出现了一次,也归为一个集合。
最后的答案数是集合数+1.
其实这种题目都是灵感很重要,刚看了题目没啥思路,去吃了饭回来路上就突然有灵感了。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; const int N=100005,M=10005; const int inf=(1<<30); int n,m; int a[N]; bool vis[M]; void solve() { int k=0,ans=0; for(int i=1;i<=n;i++) { if(!vis[a[i]]) { vis[a[i]]=true; k++; } if(k==m) { ans++; memset(vis,0,sizeof(vis)); k=0; } } printf("%d\n",ans+1); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",a+i); solve(); return 0; }