当前位置: 代码迷 >> 综合 >> Gym - 101128E Wooden Signs(DP)
  详细解决方案

Gym - 101128E Wooden Signs(DP)

热度:83   发布时间:2023-12-06 19:50:37.0

题目链接:

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;
}