[2016-03-28][POJ][3666][]Making the Grade]

Posted 红洋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2016-03-28][POJ][3666][]Making the Grade]相关的知识,希望对你有一定的参考价值。

  • 时间:2016-03-28 17:23:08 星期一

  • 题目编号:[2016-03-28][POJ][3666][]Making the Grade]

  • 分析:dp[i][j]表示把改到第i个数,且把a[i]改成b[i]需要的最少代价,已知b[j]递增,dp[i][j]由dp[i - 1][k]递推过来,如果改成非增,那么就要求 a[j] <= a[k],所以dp[i][j] = min(dp[i - 1][k] + d) k < j;

  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. const int maxn = 2000 + 10;
  6. int a[maxn],b[maxn],n;
  7. int dp[maxn][maxn];
  8. bool cmp(int x,int y){
  9. return x > y;
  10. }
  11. int main(){
  12. scanf("%d",&n);
  13. for(int i = 0;i < n ; ++i){
  14. scanf("%d",&a[i]);
  15. }
  16. memcpy(b,a,sizeof(int) * (n + 1));
  17. sort(b,b + n);
  18. memset(dp,0x7f,sizeof(dp));
  19. for(int i = 0;i < n ; ++i){
  20. dp[0][i] = abs(a[0] - b[i]);
  21. }
  22. for(int i = 1;i < n ; ++i){
  23. int mindp = 0x7f7f7f7f;
  24. for(int j = 0;j < n;++j){
  25. mindp = min(dp[i-1][j],mindp);
  26. dp[i][j] = min(dp[i][j] , mindp + abs(a[i] - b[j]));
  27. }
  28. }
  29. int ans = 0x7f7f7f7f;
  30. for(int i = 0;i < n ; ++i){
  31. ans = min(dp[n - 1][i] ,ans);
  32. }
  33. sort(b,b + n,cmp);
  34. memset(dp,0x7f,sizeof(dp));
  35. for(int i = 0;i < n ; ++i){
  36. dp[0][i] = abs(a[0] - b[i]);
  37. }
  38. for(int i = 1;i < n ; ++i){
  39. int mindp = 0x7f7f7f7f;
  40. for(int j = 0;j < n;++j){
  41. mindp = min(dp[i-1][j],mindp);
  42. dp[i][j] = min(dp[i][j] , mindp + abs(a[i] - b[j]));
  43. }
  44. }
  45. for(int i = 0;i < n ; ++i){
  46. ans = min(dp[n - 1][i] ,ans);
  47. }
  48. printf("%d\n",ans);
  49. return 0;
  50. }




以上是关于[2016-03-28][POJ][3666][]Making the Grade]的主要内容,如果未能解决你的问题,请参考以下文章

[2016-03-28][POJ][1458][Common Subsequence]

POJ3666

poj3666序列对应——DP

[POJ 3666] Making the Grade

[POJ3666] Making the Grade

POJ3666:Making the Grade——题解