BZOJ1996 合唱队 区间DP

时间:2023-03-09 13:25:00
BZOJ1996 合唱队 区间DP

OJ地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1996

设dp(i,j,k)代表在理想结果中[i,j]段最后添加的是i或j(k=0or1)

要注意的一点是程序会计算两次i=j时的情况 要特殊判断

数据不大 我写的是记忆化搜索 改成递推会更快一点

 #include<iostream>
 #include<cstdio>
 #include<cstring>
 using namespace std;
 +;
 ;
 ];
 ];
 long DP(int i,int j,int k){
     if(v[i][j][k]) return mem[i][j][k];
     v[i][j][k]=;
     ;
     ?:);
     ){
         ,j,),ans%=mod;
         ]>A[i]) ans+=DP(i+,j,),ans%=mod;
     }){
         ]<A[j]) ans+=DP(i,j-,),ans%=mod;
         ,),ans%=mod;
     }
     ans%=mod;
     return ans;

 }
 int main()
 {
   memset(v,,sizeof(v));
   scanf("%d",&N);
   ;i<=N;i++) scanf("%d",&A[i]);
     printf(,N,)+DP(,N,))%mod);
   ;
 }

From Linux