你们很难想象我经历了什么,对,就是我拉低了正确率。。先上丑陋的代码:

  1. n=input().split()
  2. m=int(n[1])
  3. n=int(n[0])
  4. L=[int(i)+1001 for i in input().split()]
  5. if m>int(n/2):
  6. print("Error!")
  7. else:
  8. re1=[[0]*(n+1) for i in range(m+1)]
  9. re2=[[0]*(n+1) for i in range(m+1)]
  10. for i in range(1,m+1):
  11. for j in range(3,n+1):
  12. if i>int(j/2):
  13. re1[i][j]=0
  14. else:
  15. re1[i][j]=max(re1[i][j-1],re1[i-1][j-2]+L[j-1])
  16. for i in range(1,m+1):
  17. for j in range(2,n+1):
  18. if i>int(j/2):
  19. re2[i][j]=0
  20. else:
  21. re2[i][j]=max(re2[i][j-1],re2[i-1][j-2]+L[j-1])
  22. print(max(re1[m-1][n-1]+L[0],re2[m][n])-m*1001)

思路:前面有一位讲过dp法的大佬和我的思路相同。由于这道题是一道环形结构,而非线性结构,dp法就会比较片面,或者说,1和n位的关系不确定。
但是可以将一个环拆成两条线,然后比较两条线的结果,取最大值
那么区别非常简单:第一个坑到底种不种
如果种,那么第二坑与第n坑就不种了,就是 在3到n-1范围内,dp【m-1】【n-1】
不种就是dp【m】【n】
然后比较
再说一下dp内部的思路,很简单就是 max(dp[i][j-1],dp[i-1][j-2]+A[j-1])
i j不满足的情况下取0
注意!由于A的值范围有负数情况,我们要手动加1001变成正数,然后再减回来
如果要更好地处理这种情况的方法,请留言,我的方法很蠢。。。

点赞(0)
 

6.6 分

6 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论