atc的一道套路线性dp
C - Jumping Takahashi (atcoder.jp)
题意:
高木在原点(x=0)处,可以跳n次,每次跳ai 或者bi 长
给定目标点X,问是否可以跳到点X处?
解:
考虑高木当前该跳第 i 步,目前的坐标为 j
且当前的这个状态是合法的,也就是说 dp[ i ][ j ]=true
那么下一步高木可以走的情况是:
j+a[i]<=x or j+b[i]<=x
则下一步的状态描述为:dp[i+1][j+a[i]] or dp[i+1][j+b[i]] 为 true
终态为:dp[n][x]
void solve() { int n,x;std::cin>>n>>x; std::vector<int>a(n),b(n); for(int i=0;i<n;i++)std::cin>>a[i]>>b[i]; std::vector dp(n+1,std::vector(x+1,0)); dp[0][0]=1; for(int i=0;i<n;i++) { for(int j=0;j<=x;j++) { if(dp[i][j]) { if(j+a[i]<=x)dp[i+1][j+a[i]]=1; if(j+b[i]<=x)dp[i+1][j+b[i]]=1; } } } std::cout<<(dp[n][x]?"Yes":"No"); }
void solve() { int n,x;std::cin>>n>>x; std::bitset<(int)(1e4+1e1)>f; f[0]=1; for(int i=0,a,b;i<n;i++) { std::cin>>a>>b; f=(f<<a)|(f<<b); } std::puts(f[x]?"Yes":"No"); }

浙公网安备 33010602011771号