当前位置:   article > 正文

poj 1088 滑雪(贪心算法)_滑雪板打包问题 c++一本通贪心算法

滑雪板打包问题 c++一本通贪心算法

思想: (贪心算法 ,看到题目是中文才做的)

  • 先对数组中的数据进行排序,从最小的数据计算 当前的顶点的可以滑行的最大值=max(周围可达的顶点的可以滑行的最大值)+1
  • 这样计算最后产生的路径肯定是最大的 
  • (看discuss中,有动态规划和dfs实现的代码,回头看看)
    1. #include <iostream>
    2. #include <algorithm>
    3. using namespace std;
    4. #define MAX 10005
    5. /*488K 63MS*/
    6. typedef struct _point
    7. {
    8. int x;
    9. int y;
    10. int w;//权重
    11. }point;
    12. int cmp(const void *a,const void *b);
    13. int main()
    14. {
    15. int r,c;
    16. cin>>r>>c;
    17. point p[MAX];
    18. int a[102][102];
    19. int index=0;
    20. for(int i=0;i<r;i++)
    21. for(int j=0;j<c;j++)
    22. {
    23. p[index].x=i;
    24. p[index].y=j;
    25. cin>>a[i][j];
    26. p[index++].w=a[i][j];
    27. }
    28. qsort(p,index,sizeof(p[0]),cmp);
    29. //贪心算法
    30. int b[102][102];
    31. memset(b,0,sizeof(b));
    32. int result=0;
    33. for(int i=0;i<index;i++)
    34. {
    35. //计算四周的值的大小
    36. int max=1;
    37. int x=p[i].x;
    38. int y=p[i].y;
    39. int w=p[i].w;
    40. //up
    41. if(x>0)
    42. {
    43. if(w>a[x-1][y]&&max<=b[x-1][y])
    44. max=b[x-1][y]+1;
    45. }
    46. //down
    47. if(x<r-1)
    48. {
    49. if(w>a[x+1][y]&&max<=b[x+1][y])
    50. max=b[x+1][y]+1;
    51. }
    52. //left
    53. if(y>0)
    54. {
    55. if(w>a[x][y-1]&&max<=b[x][y-1])
    56. max=b[x][y-1]+1;
    57. }
    58. //right
    59. if(y<r-1)
    60. {
    61. if(w>a[x][y+1]&&max<=b[x][y+1])
    62. max=b[x][y+1]+1;
    63. }
    64. b[x][y]=max;
    65. if(result<max)
    66. result=max;
    67. }
    68. cout<<result<<endl;
    69. system("pause");
    70. return 0;
    71. }
    72. int cmp(const void *a,const void *b)
    73. {
    74. return ((*(point *)a).w-(*(point *)b).w);
    75. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/790334?site
推荐阅读
相关标签
  

闽ICP备14008679号