SHARE
    TWEET
    Vince14

    /<> 1006 (DP circular -> linear)

    Oct 28th, 2023
    127
    0
    Never
    Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
    C++ 5.57 KB | Source Code | 0 0
    1. #include <iostream>
    2. #include <string>
    3. #include <cstring>
    4. #include <algorithm>
    5. #include <cmath>
    6. #include <vector>
    7. #include <set>
    8. #include <map>
    9. #include <stack>
    10. #include <queue>
    11. #include <deque>
    12. #include <unordered_map>
    13. #include <numeric>
    14. #include <iomanip>
    15. using namespace std;
    16. #define pii pair<int , int>
    17. #define ll long long
    18. #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
    19. const long long dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};
    20. const long long dl[2] = {1, -1};
    21. const long long MOD = 1000000007;
    22. const long long MAXN = 10005;
    23. int t;
    24. int n, w;
    25. vector<int> inside, outside;
    26. int dp[MAXN][2][2];
    27. void init(){
    28. inside.clear();
    29. outside.clear();
    30. cin >> n >> w;
    31. inside.push_back(-1);
    32. for(int x, i = 0; i < n; i++){
    33. cin >> x;
    34. inside.push_back(x);
    35. }
    36. outside.push_back(-1);
    37. for(int x, i = 0; i < n; i++){
    38. cin >> x;
    39. outside.push_back(x);
    40. }
    41. inside[0] = inside.back();
    42. outside[0] = outside.back();
    43. }
    44. int DP1(){
    45. for(int i = 0; i <= n; i++){
    46. dp[i][0][0] = 2e9;
    47. dp[i][0][1] = 2e9;
    48. dp[i][1][0] = 2e9;
    49. dp[i][1][1] = 2e9;
    50. }
    51. // idx, inside, outside
    52. dp[1][1][0] = 1;
    53. dp[1][0][1] = 1;
    54. dp[0][1][1] = 0;
    55. if(inside[1] + outside[1] <= w){
    56. dp[1][1][1] = 1;
    57. }
    58. else{
    59. dp[1][1][1] = 2;
    60. }
    61. for(int i = 2; i <= n; i++){
    62. dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1] + 1);
    63. if(inside[i] + inside[i - 1] <= w){
    64. dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1] + 1);
    65. }
    66. dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][1] + 1);
    67. if(outside[i] + outside[i - 1] <= w){
    68. dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][0] + 1);
    69. }
    70. dp[i][1][1] = min(dp[i][1][1], min(dp[i][0][1] + 1, dp[i][1][0] + 1));
    71. if(inside[i] + outside[i] <= w){
    72. dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][1] + 1);
    73. }
    74. if(inside[i] + inside[i - 1] <= w && outside[i] + outside[i - 1] <= w){
    75. dp[i][1][1] = min(dp[i][1][1], dp[i - 2][1][1] + 2);
    76. }
    77. }
    78. return dp[n][1][1];
    79. }
    80. int DP2(){
    81. if(inside[0] + inside[1] > w){
    82. return 2e9;
    83. }
    84. for(int i = 0; i <= n; i++){
    85. dp[i][0][0] = 2e9;
    86. dp[i][0][1] = 2e9;
    87. dp[i][1][0] = 2e9;
    88. dp[i][1][1] = 2e9;
    89. }
    90. dp[1][1][0] = 1;
    91. dp[1][1][1] = 2;
    92. for(int i = 2; i <= n; i++){
    93. dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1] + 1);
    94. if(inside[i] + inside[i - 1] <= w){
    95. dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1] + 1);
    96. }
    97. dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][1] + 1);
    98. if(outside[i] + outside[i - 1] <= w){
    99. dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][0] + 1);
    100. }
    101. dp[i][1][1] = min(dp[i][1][1], min(dp[i][0][1] + 1, dp[i][1][0] + 1));
    102. if(inside[i] + outside[i] <= w){
    103. dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][1] + 1);
    104. }
    105. if(inside[i] + inside[i - 1] <= w && outside[i] + outside[i - 1] <= w){
    106. dp[i][1][1] = min(dp[i][1][1], dp[i - 2][1][1] + 2);
    107. }
    108. }
    109. return dp[n][0][1];
    110. }
    111. int DP3(){
    112. if(outside[0] + outside[1] > w){
    113. return 2e9;
    114. }
    115. for(int i = 0; i <= n; i++){
    116. dp[i][0][0] = 2e9;
    117. dp[i][0][1] = 2e9;
    118. dp[i][1][0] = 2e9;
    119. dp[i][1][1] = 2e9;
    120. }
    121. dp[1][0][1] = 1;
    122. dp[1][1][1] = 2;
    123. for(int i = 2; i <= n; i++){
    124. dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1] + 1);
    125. if(inside[i] + inside[i - 1] <= w){
    126. dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1] + 1);
    127. }
    128. dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][1] + 1);
    129. if(outside[i] + outside[i - 1] <= w){
    130. dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][0] + 1);
    131. }
    132. dp[i][1][1] = min(dp[i][1][1], min(dp[i][0][1] + 1, dp[i][1][0] + 1));
    133. if(inside[i] + outside[i] <= w){
    134. dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][1] + 1);
    135. }
    136. if(inside[i] + inside[i - 1] <= w && outside[i] + outside[i - 1] <= w){
    137. dp[i][1][1] = min(dp[i][1][1], dp[i - 2][1][1] + 2);
    138. }
    139. }
    140. return dp[n][1][0];
    141. }
    142. int DP4(){
    143. if(inside[0] + inside[1] > w or outside[0] + outside[1] > w){
    144. return 2e9;
    145. }
    146. for(int i = 0; i <= n; i++){
    147. dp[i][0][0] = 2e9;
    148. dp[i][0][1] = 2e9;
    149. dp[i][1][0] = 2e9;
    150. dp[i][1][1] = 2e9;
    151. }
    152. dp[1][1][1] = 2;
    153. for(int i = 2; i <= n; i++){
    154. dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1] + 1);
    155. if(inside[i] + inside[i - 1] <= w){
    156. dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1] + 1);
    157. }
    158. dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][1] + 1);
    159. if(outside[i] + outside[i - 1] <= w){
    160. dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][0] + 1);
    161. }
    162. dp[i][1][1] = min(dp[i][1][1], min(dp[i][0][1] + 1, dp[i][1][0] + 1));
    163. if(inside[i] + outside[i] <= w){
    164. dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][1] + 1);
    165. }
    166. if(inside[i] + inside[i - 1] <= w && outside[i] + outside[i - 1] <= w){
    167. dp[i][1][1] = min(dp[i][1][1], dp[i - 2][1][1] + 2);
    168. }
    169. }
    170. return dp[n - 1][1][1];
    171. }
    172. void solve(){
    173. init();
    174. if(n == 1){
    175. cout << DP1() << "\n";
    176. return;
    177. }
    178. cout << min(min(DP1(), DP2()), min(DP3(), DP4())) << "\n";
    179. }
    180. int main() {
    181. FAST;
    182. cin >> t;
    183. for(int i = 0; i < t; i++){
    184. solve();
    185. }
    186. }
    Advertisement
    Add Comment
    Please, Sign In to add comment
    Public Pastes
    We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
    Not a member of Pastebin yet?
    Sign Up, it unlocks many cool features!

    AltStyle によって変換されたページ (->オリジナル) /