题目链接:
https://odzkskevi.qnssl.com/3699857ff0a17d77d1099699cdf4da13?v=1490503337
题目大意:
一共n块木板,前两个数给出最底下木块的两个端点,后面n-1个数给出第i层的一个固定端点,问你木块的所有放置情况。
分析:
由下层的不同放置方式可以引出上层的各种不同放置方式,直接dp就行。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2017;
const ll mod = 2147483647;
ll dp[maxn][maxn];
int pos[maxn];
int main()
{
int n;
while(cin >> n)
{
memset(dp, 0, sizeof(dp));
for(int i = 0; i <= n; i++)
cin >> pos[i];
dp[1][pos[0]] = 1;
for(int i = 2; i <= n; i++)
for(int j = 1; j <= n+1; j++)
{
int l = min(pos[i-1], j), r = max(pos[i-1], j);
if(pos[i] <= l)
dp[i][r] = (dp[i][r] + dp[i-1][j]) % mod;
else if(pos[i] >= r)
dp[i][l] = (dp[i][l] + dp[i-1][j]) % mod;
else
{
dp[i][r] = (dp[i][r] + dp[i-1][j]) % mod;
dp[i][l] = (dp[i][l] + dp[i-1][j]) % mod;
}
}
ll ans = 0;
for(int i = 1; i <= n+1; i++)
ans = (ans + dp[n][i]) % mod;
cout << ans << endl;
}
return 0;
}