数据结构优化的DP

数据结构优化的DP

# include <bits/stdc++.h>
using namespace std;

const int mod=1e9+7;
const int MAXN=1e3+100;
int T,N,M;
int f[MAXN][MAXN],a[MAXN],c[MAXN],aa[MAXN];
map<int,int> val;
int lowbit(int x) { return x&(-x); }
void add(int x,int y)
{
   for(int i=x;i<=N;i+=lowbit(i)){
       c[i]=(c[i]+y)%mod;
  }
   return ;
}
int sum(int x)
{
   int ans=0;
   for(int i=x;i;i-=lowbit(i)){
       ans=(ans+c[i])%mod;
  }
   return ans;
}
int main()
{
   scanf("%d",&T);
   for(int cas=1;cas<=T;++cas){
       scanf("%d%d",&N,&M);
       for(int i=1;i<=N;++i){
           scanf("%d",&a[i]);
           aa[i]=a[i];
      }
       sort(aa+1,aa+1+N,less<int>());
       for(int i=1;i<=N;++i){
           val[aa[i]]=i+1;
      }
       memset(f,0,sizeof(f));
       a[0]=-(1<<30); // -INF
       val[a[0]]=1;
       f[0][0]=1;
       for(int i=1;i<=M;++i){
           memset(c,0,sizeof(c));
           add(val[a[0]],f[i-1][0]);
           for(int j=1;j<=N;++j){
               f[i][j]=sum(val[a[j]]-1);
               add(val[a[j]],f[i-1][j]);
          }
      }
       int ans=0;
       for(int i=1;i<=N;++i) ans=(ans+f[M][i])%mod;
       printf("Case #%d: %d\n",cas,ans);

  }
   return 0;
}



posted @ 2022-02-26 23:03  fengzlj  阅读(79)  评论(0)    收藏  举报