Advertisement
a53

skipass

a53
Jan 24th, 2018
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. #include <fstream>
  2. using namespace std;
  3. int G,N1,N2,C1[1001],C2[1001],dp[3][1001];
  4.  
  5. void Citire()
  6. {
  7. ifstream f("skipass.in");
  8. f>>G>>N1;
  9. for(int i=N1;i>=1;--i)
  10. f>>C1[i];
  11. f>>N2;
  12. for(int i=N2;i>=1;--i)
  13. f>>C2[i];
  14. f.close();
  15. }
  16.  
  17. int main()
  18. {
  19. Citire();
  20. for(int i=0;i<=N1;++i)
  21. {
  22. for(int j=0;j<=N2;++j)
  23. {
  24. dp[2][j]=i+j;
  25. if(j>=1) /// cea de-a doua coada contine macar un om: acel om pleaca singur si raman doar j-1 oameni la a 2-a coada
  26. dp[2][j]=min(dp[2][j],dp[2][j-1]+1); /// Pentru acest caz se stie deja minimul (a fost calculat anterior)
  27. if(i>=1) /// prima coada contine macar un om: primul om pleaca singur si raman doar i-1 in prima coada
  28. dp[2][j]=min(dp[2][j],dp[1][j]+1);
  29. if(i>=2&&C1[i]==C1[i-1]) /// primii 2 oameni de la prima coada fac parte din acelasi grup si pot pleca impreuna
  30. dp[2][j]=min(dp[2][j],dp[0][j]+1);
  31. if(j>=2&&C2[j]==C2[j-1]) /// primii 2 oameni de la a 2-acoada fac parte din acelasi grup si pot pleca impreuna
  32. dp[2][j]=min(dp[2][j],dp[2][j-2]+1);
  33. if(i>=1&&j>=1&&C1[i]==C2[j]) /// primii de la ambele cozi pot pleca impreuna
  34. dp[2][j]=min(dp[2][j],dp[1][j-1]+1);
  35. }
  36. for(int j=0;j<=N2;++j)
  37. dp[0][j]=dp[1][j],dp[1][j]=dp[2][j];
  38. }
  39. ofstream g("skipass.out");
  40. g<<dp[2][N2];
  41. g.close();
  42. return 0;
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement