DP basic 455A codeforces

  1. // DP practice
  2. // 455A --- codeforces
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <cstring>
  6. using namespace std;
  7. const int N = 1000010;
  8. long long int dp[N];
  9. long long int cnt[N];
  10. int main()
  11. {
  12. int iT;
  13. int iNum,iLarge;
  14. int i,j;
  15. cin >> iT;
  16. memset(cnt,0,sizeof(cnt));
  17. iLarge = 0;
  18. for ( i=0 ; i<iT ; i++ )   
  19.     {
  20.     cin >> iNum;
  21.     // count number appear times
  22.     cnt [iNum]++;
  23.     // store the largest number to reduce run time
  24.     if ( iNum>iLarge )
  25.         iLarge = iNum;
  26.     }
  27. dp[0] = 0;
  28. dp[1] = cnt[1];
  29. for ( j=2 ; j<=iLarge ; j++ )
  30.     dp[j] = max(dp[j-1],dp[j-2] + (cnt[j]*j)); 
  31.        
  32. cout << dp[j-1] << endl;   
  33. }

DETAIL:
ex:    input 2 --  1  2
cnt[1] = 1        cnt[2] = 2                        2 different number
dp[0] = 0        dp[1] = 1                         拿第一種的情況
dp[2] = max ( dp[1], dp[0] + 1*2 )     拿第二種的情況

ex:   input 9 -- 1 2 1 3 2 2 2 2 3
cnt[1] = 2   cnt[2] = 5    cnt[3] = 2       3 different number
dp[0] = 0    dp[1] = 1                              拿第一種的情況
dp[2] = max ( dp[1],  dp[0]+2*5 )       拿第二種的情況
dp[3] = max (dp[2], dp[1] + 3*2 )        拿第三種的情況 




留言

這個網誌中的熱門文章

Codeforces --- string task

Uva 674 ---- coin change

codeforces 271A --- beautiful year