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