abc221G Jumping sequence
首先,我们将平面旋转
因此,问题为将
此外,定义
如果其中一个等式的右边是负数、大于
否则,可以用动态编程(DP)来解决这个问题,其中:
但要注意的是,我们需要计算约
代码:
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll MOD=998244353;
// head
int main()
{
cin.tie(nullptr);
ios::sync_with_stdio(false);
bitset<3600001> dp[2001];
char op[4]={'L','U','D','R'};
int d[2000];
int m[2];
int n,x,y;cin>>n>>x>>y;
int sum=0;
for(int i=0;i<n;i++) {cin>>d[i];sum+=d[i];}
m[0]=x+y,m[1]=x-y;
bool flag=true;
for(int i=0;i<2;i++) if(abs(m[i])>sum) flag=false;
for(int i=0;i<2;i++) if((m[i]+sum)%2!=0) flag=false;
if(!flag) {cout<<"No"<<endl;return 0;}
for(int i=0;i<2;i++) m[i]=(m[i]+sum)/2;
dp[0][0]=1;
for(int i=0;i<2000;i++) dp[i+1]=dp[i]|(dp[i]<<d[i]);
if((!dp[n][m[0]])||(!dp[n][m[1]])) {cout<<"No"<<endl;return 0;}
string ans;
for(int i=n-1;i>=0;i--){
sum=0;
for(int j=0;j<2;j++){
if(!dp[i][m[j]]){
m[j]-=d[i];
sum+=(1<<j);
}
}
ans=op[sum]+ans;
}
cout<<"Yes"<<endl;
cout<<ans<<endl;
}