Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2020
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long int
  4. #define INF LLONG_MAX
  5. #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  6.  
  7. int main() {
  8.  
  9.     fastio;
  10.  
  11.     ll n,k;
  12.     vector<char> a(100);
  13.     ll dp[100][100][3];
  14.  
  15.     cin >> n >> k;
  16.     for(ll i = 1; i <= n; i++) cin >> a[i];
  17.  
  18.     // OPTIMAL SUB-PROBLEM :
  19.  
  20.     // dp[i][j][0] = maximum number of games bessie can win if we play HOOF at first i games and k = j
  21.     // dp[i][j][1] = maximum number of games bessie can win if we play PAPERS at first i games and k = j
  22.     // dp[i][j][2] = maximum number of games bessie can win if we play SCISSORS at first i games and k = j
  23.  
  24.     // BASE CASE :
  25.  
  26.     if(a[1] == 'H') {
  27.         for(ll j = 1; j <= k ;j++) dp[1][j][1] = 1;
  28.         for(ll j = 1; j <= k; j++) dp[1][j][0] = 0;
  29.         for(ll j = 1; j <= k; j++) dp[1][j][2] = 0;
  30.     }
  31.  
  32.     if(a[1] == 'S') {
  33.         for(ll j = 1; j <= k ;j++) dp[1][j][0] = 1;
  34.         for(ll j = 1; j <= k; j++) dp[1][j][1] = 0;
  35.         for(ll j = 1; j <= k; j++) dp[1][j][2] = 0;
  36.     }
  37.  
  38.     if(a[1] == 'P') {
  39.         for(ll j = 1; j <= k ;j++) dp[1][j][1] = 0;
  40.         for(ll j = 1; j <= k; j++) dp[1][j][0] = 0;
  41.         for(ll j = 1; j <= k; j++) dp[1][j][2] = 1;
  42.     }
  43.  
  44.  
  45.     // RECURSIVE RELATION :
  46.  
  47.     for(ll i = 1; i <= n; i++){
  48.         for(ll j = 1; j <= 1; j++){
  49.  
  50.             if(a[i] == 'H') {
  51.  
  52.                 dp[i][j][1] = 1 + max(dp[i-1][k-1][0],max(dp[i-1][k-1][2] , dp[i-1][k][1]));
  53.                 dp[i][j][0] = max(dp[i-1][k-1][1],max(dp[i-1][k-1][2] , dp[i-1][k][0]));
  54.                 dp[i][j][2] = max(dp[i-1][k-1][0],max(dp[i-1][k-1][1] , dp[i-1][k][2]));
  55.  
  56.             }
  57.  
  58.             if(a[i] == 'S') {
  59.  
  60.                 dp[i][j][0] = 1 + max(dp[i-1][k-1][1],max(dp[i-1][k-1][2] , dp[i-1][k][0]));
  61.                 dp[i][j][1] = max(dp[i-1][k-1][0],max(dp[i-1][k-1][2] , dp[i-1][k][1]));
  62.                 dp[i][j][2] = max(dp[i-1][k-1][0],max(dp[i-1][k-1][1] , dp[i-1][k][2]));
  63.             }
  64.  
  65.             if(a[i] == 'P') {
  66.  
  67.                 dp[i][j][2] = 1 + max(dp[i-1][k-1][0],max(dp[i-1][k-1][1] , dp[i-1][k][2]));
  68.                 dp[i][j][0] = max(dp[i-1][k-1][1],max(dp[i-1][k-1][2] , dp[i-1][k][0]));
  69.                 dp[i][j][1] = max(dp[i-1][k-1][0],max(dp[i-1][k-1][2] , dp[i-1][k][1]));
  70.             }
  71.         }
  72.     }
  73.  
  74.     // OPTIMAL SOLUTION :
  75.  
  76.     cout << max(dp[n][k][0] , max(dp[n][k][1] , dp[n][k][2]));
  77.  
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement