낙곡P3205 [HNOI2010] 합창단(구간dp)

3568 단어

전송문


문제풀이의 방향


대형의 구성 방식을 관찰하면 꼴찌가 구간 i에 가입하는 것을 알 수 있다.j의 사람은 i의 위치에 있거나 j의 위치에 있기 때문에 우리는 dp[i][j][0]로 구간 i를 표시할 수 있다.j 마지막으로 가입한 사람이 i 위치에 서 있는 방안의 총수는 같은 이치로 dp[i][j][1]로 구간 i...제이가 마지막으로 가입한 사람이 제이의 위치에 서 있는 방안의 총수.
그리고 상황에 따라 토론하면 된다.
마지막 답안은 dp[1][n][0]+dp[1][n][1]과 같다.
모든 조작에 대해 남은 것을 찾는 것을 잊지 마라.

AC 코드

 1 #include
 2 using namespace std;
 3 int n,dp[1005][1005][2],a[1005];
 4 const int mod=19650827;
 5 int main()
 6 {
 7     cin>>n;
 8     for(int i=1;i<=n;i++){
 9         cin>>a[i];
10         dp[i][i][0]=dp[i][i][1]=1;
11     }
12     for(int i=1;i<=n;i++){
13         int j=i+1;
14         if(j>n) break;
15         if(a[i]0]=dp[i][j][1]=1;
16     }
17     for(int len=3;len<=n;len++){
18         for(int i=1;i<=n;i++){
19             int j=i+len-1;
20             if(j>n) break;
21             if(a[i]1]){
22                 dp[i][j][0]+=dp[i+1][j][0];
23             }
24             if(a[i]<a[j]){
25                 dp[i][j][0]+=dp[i+1][j][1];
26             }
27             if(a[j]>a[i]){
28                 dp[i][j][1]+=dp[i][j-1][0];
29             }
30             if(a[j]>a[j-1]){
31                 dp[i][j][1]+=dp[i][j-1][1];
32             }
33             dp[i][j][0]%=mod;
34             dp[i][j][1]%=mod;
35         }
36     }
37     cout<1][n][0]+dp[1][n][1])%mod;
38     return 0;
39 }

좋은 웹페이지 즐겨찾기