其他分享
首页 > 其他分享> > [HNOI2010]合唱队 luogu3205

[HNOI2010]合唱队 luogu3205

作者:互联网

区间dp,主要问题还是不知道怎么去存状态,感觉dp应该只要探求一个情况如何变到另一个情况就行了……

0右1左

dp[i][j][1]=dp[i+1][j][0]+dp[i+1][j][1]

dp[i][j][0]=dp[i][j-1][0]+dp[i][j-1][1]

#include<bits/stdc++.h>
using namespace std;
long long dp[1010][1010][2]={0};
long long a[100010]; 
long long mod=19650827;
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;
    for(int len=1;len<n;len++)
        for(int i=1,j=len+i;i<=n&&j<=n;j++,i++)
        {
            if(a[i]<a[j])
                dp[i][j][1]=(dp[i][j][1]+dp[i+1][j][0])%mod;
            if(a[i]<a[i+1])
                dp[i][j][1]=(dp[i][j][1]+dp[i+1][j][1])%mod;
            if(a[j]>a[j-1])
                dp[i][j][0]=(dp[i][j][0]+dp[i][j-1][0])%mod;
            if(a[j]>a[i])
                dp[i][j][0]=(dp[i][j][0]+dp[i][j-1][1])%mod;
            dp[i][j][0]%=mod;
            dp[i][j][1]%=mod;
        }
    printf("%lld",(dp[1][n][0]+dp[1][n][1])%mod);
    return 0;
}

 

标签:luogu3205,合唱队,int,long,19650827,HNOI2010,1010,dp,mod
来源: https://www.cnblogs.com/Enkidu-okitasouji/p/15662689.html