题目链接:
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;
}