Advertisement
royalsflush

Referência para LA 3534 (Luiza)

Apr 6th, 2012
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. int s[2][10010];
  7. int dp[2][10010];
  8. int l[2];
  9.  
  10. int find(int snum, int key) {
  11.     int b=0,e=l[snum]-1;
  12.    
  13.     while (b<=e) {
  14.         int mid = (b+e)/2;
  15.        
  16.         if (s[snum][mid]==key) return mid;
  17.         else
  18.             if (s[snum][mid]<key) b=mid+1;
  19.             else e=mid-1;
  20.     }
  21.    
  22.     return -1; 
  23. }
  24.  
  25. int doit(int snum, int spos) {
  26.     if (spos==l[snum]) return 0;
  27.     if (dp[snum][spos]!=-1) return dp[snum][spos];
  28.  
  29.     int opos = find((snum+1)%2,s[snum][spos]);
  30.     int& res = dp[snum][spos];
  31.  
  32.     if (opos==-1)
  33.         return res=doit(snum,spos+1)+s[snum][spos];
  34.     else
  35.         return res=s[snum][spos]+max(doit(snum,spos+1),
  36.             doit((snum+1)%2,opos+1));
  37. }
  38.  
  39. int main() {
  40.     while (1) {
  41.         scanf("%d", &l[0]);
  42.         if (!l[0]) break;
  43.         memset(dp,-1,sizeof(dp));
  44.  
  45.         for (int i=0; i<l[0]; i++)
  46.             scanf("%d", &s[0][i]);
  47.  
  48.         scanf("%d", &l[1]);
  49.         for (int i=0; i<l[1]; i++)
  50.             scanf("%d", &s[1][i]);
  51.    
  52.         printf("%d\n", max(doit(0,0),doit(1,0)));
  53.     }
  54.     return 0;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement