P3205 [HNOI2010]合唱队
作者:互联网
题目:
https://www.luogu.com.cn/problem/P3205
dp[i][j][0]表示第i个数从左边进
dp[i][j][1]表示第j个数从右边进
注意处理边界属于等价的情况,只用算一遍
#include<stdio.h> #include<algorithm> #include<string.h> #include<queue> using namespace std; typedef pair<int ,int > p; typedef long long ll; const int mod=19650827; int a[1003]; int dp[1003][1003][2]; //dp[i][j][0]表示第i个人从左边 //dp[i][j][1]表示第j个人从右边 int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) dp[i][i][0]=1;//i==j的时候只有一个数,等价于从左边进或者从右边进 int ans=0; for(int len=1;len<=n;len++) { for(int i=1,j=i+len-1;j<=n;i++,j++) { if(a[i]<a[i+1]) dp[i][j][0]+=dp[i+1][j][0]; if(a[i]<a[j]) dp[i][j][0]+=dp[i+1][j][1]; if(a[j]>a[j-1]) dp[i][j][1]+=dp[i][j-1][1]; if(a[j]>a[i]) dp[i][j][1]+=dp[i][j-1][0]; dp[i][j][0]%=mod; dp[i][j][1]%=mod; } } printf("%d\n",(dp[1][n][0]+dp[1][n][1])%mod); }
标签:合唱队,int,long,HNOI2010,P3205,include,1003,dp,mod 来源: https://www.cnblogs.com/aacm/p/15076564.html