UVa 1638 Pole Arrangement

本文介绍了一种使用动态规划方法解决视线阻挡问题的算法。通过定义dp(i,j,k)为i根柱子,左边能看到j根,右边能看到k根的情况数,推导出了状态转移方程,并给出了具体的实现代码。

题目

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51199

题解

dp(i,j,k)表示i根,左边看j根,右边看k根的情况数
从大到小放,在放好2~n的情况下,考虑放1。
1——–放最左边,则放后共有dp(i-1,j-1,k)种可能
2——–放最右边,则放后共有dp(i-1,j,k-1)种可能
3——–随便放中间,这时就看不到了,因为共有i-2个空隙,放后共有dp(i-1,j,k)*(i-2) 种可能
所以转移方程dp(i,j,k)=dp(i-1,j-1,k)+dp(i-1,j,k-1)+dp(i-1,j,k)*(i-2)
边界dp(1,1,1)=1;


一开始没想出来。觉得很难。后来一想,其实本质是找一种比较方便的方法,因为先放矮的会被后放的高的挡住,而且后放高的情况很复杂,但是后放矮的就只有三种情况,所以做题还是要找那个最核心的点。

代码

// QWsin
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x) for(int i=1;i<=x;i++)
using namespace std;
typedef unsigned long long ull;
const int maxn=20+10;

int n,l,r;
ull dp[maxn][maxn][maxn];

inline void solve()
{
    rep(i,n) rep(j,r) rep(k,r) dp[i][j][k]=0;

    scanf("%d%d%d",&n,&l,&r);
    dp[1][1][1]=1;
    for(int i=2;i<=n;i++)
        for(int j=1;j<=l;j++)
            for(int k=1;k<=r;k++)
                dp[i][j][k]=dp[i-1][j-1][k]+dp[i-1][j][k-1]+dp[i-1][j][k]*(i-2);
    cout<<dp[n][l][r]<<endl;
}

int main()
{
    int T;cin>>T;
    while(T--) solve();
    return 0;
}
### C++ POLE Library Usage and Documentation The POLE (Portable Object Layer for Embedded systems) library is a powerful tool designed to facilitate the development of applications that require handling compound files, such as Microsoft Office documents. This section provides an overview of how this library can be utilized within C++ programs. To use the POLE library effectively, one must first include necessary headers which are similar in nature when including standard libraries like `<iostream>` or other utility libraries mentioned previously[^1]. For instance: ```cpp #include <pole/pole.h> using namespace pole; ``` Once included, creating instances from classes provided by the POLE library allows manipulation of structured storage formats easily. An example demonstrating basic file operations with POLE follows below: ```cpp // Open existing document stream. Storage stg("example.doc", modeReadOnly); Stream stm(stg.root(), "WordDocument"); // Read content into buffer. char buf[1024]; size_t size = stm.read(buf, sizeof(buf)); // Process data... ``` This snippet shows opening a Word document (`example.doc`) in read-only mode and accessing its main text stream named `"WordDocument"` where actual textual information resides inside binary format files created by MS Office products. For comprehensive guidance on utilizing all features offered by the POLE library, consulting official documentation would provide detailed explanations about class methods along with examples illustrating more complex scenarios beyond simple reads/writes shown here.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值