专栏文章
[ABC271D] Flip and Adjust 题解
AT_abc271_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqyu5va
- 此快照首次捕获于
- 2025/12/04 12:58 3 个月前
- 此快照最后确认于
- 2025/12/04 12:58 3 个月前
csdn:这里
一、解题思路
观察题面,发现是一道板里板气的可行性
所以用一个二维数组来表示前张牌能否组成
考虑状态转移方程,分析发现,对于一个而言,其可行性取决于之前的值是否为真
由此得出状态转移方程:
由于之前的值只要有一个为真,当前状态便可成立,所以使用 号来进行转移
至此,我们解决了问题的第一部分,现在来看第二部分,输出方案。
观察数据范围
考虑搜索回退并在回退时记录方案
二、代码展示
C#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[200005],b[200005],m,dp[205][20005];
string s;
void e(int sum,int st){//搜索回退
if(st<1||sum<1)return;
if(dp[st-1][sum-a[st]]&&sum-a[st]>=0){//注意(sum-a[st]>=0)防止多记
e(sum-a[st],st-1);
s+='H';//记录方案
}
else if(dp[st-1][sum-b[st]]&&sum-b[st]>=0){
e(sum-b[st],st-1);
s+='T';
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i]>>b[i];
dp[0][0]=1;
for(int i=1;i<=n;++i)
for(int j=0;j<=m;++j)
dp[i][j+a[i]]|=dp[i-1][j],//dp状态转移
dp[i][j+b[i]]|=dp[i-1][j];
if(dp[n][m])cout<<"Yes\n";
else cout<<"No\n";
e(m,n);
cout<<s;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...