낙곡P3205 [HNOI2010] 합창팀 문제풀이

10820 단어 dp

원제 주소


谔谔, 이게 무슨 문제야. 내가 첫눈에 흐리멍덩하게 보고 폭력을 퍼부었는데 부분도 속일 수 없다는 걸 발견했어... 나중에 보니 이 tm가 왜 구간 dp 같지?!문제풀이 구역을 다 보고?!참!방법을 공유해 봅시다. 3차원 그룹 dp[i][j] [k](k\8712[0, 1]) dp[i][j][j] [k](k\in[0,1]) dp[i](k][i] [i][i] [i] [k][i] [i] [i] dp[k] (k\in[0,1]) dp[i] [j] dp[i] [i] [j] [i] [j] [j]]]]]][j][0]]]]]]]][j]]]]]]][j]]]][j]]]]]]][j]]]]]][j]]]][j]]]]][j]]]]]][j]]]]][j]]o u n t count countdp[i][j][0]dp[i][j][0]dp[i][j][0]는 [i+1, j][i+1, j][i+1, j]의 동네에서 왔다(즉 [i, j][i, j][i, j]는 [i, i] [i, i] [i, i] [i, i] [i, i] (i, i] (i i가 맨 왼쪽), [i+1, j] [i+1, j] [i+1, j] 두 개의 구간으로 나뉘어 있음을 발견하기 어렵지 않다.그래서 iii의 앞자리 숫자가 jt h jth 또는 (i+1)t h (i+1)th(i+1)th(i+1)th가 iii의 위치로 넘어갈 수도 있다. if(a [j] > a [i]) d p [i] [j] [제] [제] [제] [제] [0] + [0] + 1] [j] [1] [1] if (a[i + 1] > a [i]) d p [i]: [i] [i] [i] [i] d p [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [i] [[[0]+=dp[i+1][j][1]\\if(a[i+1]>a[i])dp[i][j][0]+=dp[i+1][j][0]if(a[j]>a[i])dp[i][j][0]+=dp[i+1][j][1]if(a[i+1]>a[i])dp[i][j][0]+=dp[i+1][j][0]그리고 dp[i][j][1]dp[i][j][1]dp[i][j][1]동리식은 스스로 밀거나 아래를 직접 본다.C o d e\color{blue}Code Code:
# include 
using namespace std;
const int N=1010;
const int mod=19650827;
int n,a[N];
int dp[N][N][2];
int main(void) 
{
	cin >> n;
	for(int i=1;i<=n;i++) cin >> a[i];
	for(int i=1;i<=n;i++) dp[i][i][0]=1;
	for(int len=2;len<=n;len++) 
	{
		for(int i=1;i<=n;i++) 
		{
			int j=i+len-1;
			dp[i][j][0]=(dp[i][j][0]+dp[i+1][j][0]*(a[i+1]>a[i])+dp[i+1][j][1]*(a[j]>a[i]))%mod;
			dp[i][j][1]=(dp[i][j][1]+dp[i][j-1][1]*(a[j-1]<a[j])+dp[i][j-1][0]*(a[i]<a[j]))%mod;
		}
	}
	cout<<(dp[1][n][0]+dp[1][n][1])%mod;
	return 0;
}

좋은 웹페이지 즐겨찾기