>

Leetcode - Count Primes

- 编辑:正版管家婆马报彩图 -

Leetcode - Count Primes

图片 1Screenshot from 2016-02-23 23:14:39.png

1.主题材料相关

  • 标签DP 单调队列优化
  • 标题地址:http://poj.org/problem?id=1821
  • 主题素材大要:有 N 块一而再的木板,并有 K 个工友来粉刷,但不供给整个粉刷。每一种工人有四个参数:L,P,S,表示其最多粉刷一而再的 L 块木板,何况每粉刷一块木板可获得 P 元,但所粉刷的木板必需回顾第 S 块。输出所能得到最大价值。

My code:

2.思路

  • 先以 S 为率先要害字排序,创设 DP 方程。
  • dp[i][j] 表示第 i 个人粉刷到第 j 块木板,所收获最大价值。
  • dp[i][j] = max{ dp[i][j-1] , dp[i-1][j] , dp[i-1][k] + (j-k)·p[i] }
  • 独家表示:第 i 个人不刷、第 j 面墙不刷、第 i 个人刷 k+1 到 j 块木板。且对于第二种,需满意 j-l[i]<=k<=s[i]-1 和 s[i]<=j<=s[i]+l[i]-1。
  • 创造方程后会开采,直接DP会TLE,所以要开展局地优化。
  • 对此第一、第二项大家得以成功n^2,所以须求重视优化第三项。
  • 整理后方可窥见其得以转正为 dp[i-1][k]+k×p[i] 和 j×P[i] 这两项。
  • 当中前一项可身为关于 k 的函数,后一项则是常数。而且对于各样 j 来讲最优的 k 都以多如牛毛的。
  • 因而就足以用三个值单调递减,地点单调递增的干瘪队列来保卫安全。一同先把相符条件的 k 扫贰遍,并保养队列。在递推时每一趟查看队头,若当前 k 对于 j 不切合,则出队,直至符合。

点击查阅代码

public class Solution { public int countPrimes { if (n <= 1) return 0; boolean[] isPrime = new boolean[n]; for (int i = 0; i < n; i++) isPrime[i] = true; for (int i = 2; i * i < n; i++) { if (!isPrime[i]) continue; for (int j = i * i; j < n; j += i) { isPrime[j] = false; } } int count = 0; for (int i = 2; i < n; i++) { if (isPrime[i]) count++; } return count; }}

那道标题即使是easy,不过显示了四处优化的思考。首先,基本思维是,是素数刷。然后,在刷的长河中,又有七个优化。三个是 pp + p, pp + 2p 的刷叁个是,截至条件是, (p * p + i*p ) ^ 2 < n

实际看她的hint把。

Anyway, Good luck, Richardo!

本文由编程应用发布,转载请注明来源:Leetcode - Count Primes