956 最高的广告牌
程序员文章站
2024-03-15 08:30:47
...
记两个算法:一个纯暴力解决,超越了0.0%的用户:
public int tallestBillboard(int[] rods) {
int total = 0;
for (int i : rods) {
total += i;
}
return tallestBillboardAss(rods, 0, 0, 0, total, 0);
}
public int tallestBillboardAss(int[] rods, int left, int right, int i, int total, int re) {
if (i == rods.length && left == right) {
return left;
} else if (i == rods.length && left != right) {
return 0;
} else if (Math.abs(left - right) > total) {
return 0;
} else if (re > (left + right + total) / 2) {
return 0;
}
int b = tallestBillboardAss(rods, left + rods[i], right, i + 1, total - rods[i], re);
re = b > re ? b : re;
int c = tallestBillboardAss(rods, left, right + rods[i], i + 1, total - rods[i], re);
re = re > c ? re : c;
int a = tallestBillboardAss(rods, left, right, i + 1, total - rods[i], re);
return Math.max(re, a);
}
另一个算法较为优秀,采用的是动态规划方法:
public int tallestBillboard2(int[] rods) {
int len = rods.length;
int[][] dp = new int[len+1][5001];
for (int i = 0; i < len+1; i++) {
for (int j = 0; j < dp[0].length; j++) {
dp[i][j] = -5001;
}
}
int sum = 0;
dp[0][0] = 0;
for (int i = 1; i <= len; i++) {
sum += rods[i-1];
for (int j = 0; j <= sum; j++) {
dp[i][j] = Math.max(dp[i-1][j],dp[i][j]);
if (j + rods[i-1] <= sum) {
dp[i][j+rods[i-1]] = Math.max(dp[i-1][j], dp[i][j+rods[i-1]]);
}
dp[i][Math.abs(j-rods[i-1])] = Math.max(dp[i][Math.abs(j-rods[i-1])], dp[i-1][j] + Math.min(j,rods[i-1]));
}
}
return dp[len][0];
}
上一篇: location ^~ /images/
下一篇: 自定义图形层次系统
推荐阅读
-
956 最高的广告牌
-
mou年电影国内票房最高的演员是谁
-
mysql一个表存多少数据才是性能最高的 博客分类: WebHibernate其他Ibatis3 mysqldbibatishibernate
-
mysql一个表存多少数据才是性能最高的 博客分类: WebHibernate其他Ibatis3 mysqldbibatishibernate
-
为什么《百家讲坛》上的中学教师收视率最高? 博客分类: 无益 生活ASP.net旅游BlogASP
-
为什么《百家讲坛》上的中学教师收视率最高? 博客分类: 无益 生活ASP.net旅游BlogASP
-
MySQL 查找价格最高的图书经销商的几种SQL语句_MySQL
-
世界最强的十大恐龙 蛮龙生性极度残暴,霸王龙名气最高
-
PHP中提问频率最高的11个面试题和答案,php试题
-
php的内部函数是否全部是用c写的,是否效率最高?