每一轮,后面的都打第一个,第一个回头打第二个。。。。只要记录开头的两个就可以了
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=4000;
bool vis[maxn][maxn];
int n,k,p[maxn],sp[maxn],ans=0;
void dfs(int A,int B,int t)
{
if(vis[A][B]) return ;
vis[A][B]=true; ans++;
if(t==k||B>n) return;
int p1=p[A],p2=sp[B];
if(p1)
{
if(p2) dfs(B+1,B+2,t+1);
if(p2!=100) dfs(A,B+1,t+1);
}
if(p1!=100&&p2) dfs(B,B+1,t+1);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",p+i);
for(int i=n;i>=1;i--) sp[i]=max(sp[i+1],p[i]);
dfs(1,2,0);
printf("%d\n",ans);
return 0;
}