Jan 09 - House Robber; DP;

用DP思维很好解决 注意终止条件 这里添加了一个数组 length = nums.length + 1;

代码:

public class Solution {
public int rob(int[] nums) {
int[] money = new int[nums.length+1];
if(nums.length == 0) return 0;
for(int i = 0; i <= nums.length; i++){
if(i == 0) money[i] = 0;
else if(i == 1) money[i] = nums[0];
else{
money[i] = Math.max(money[i-1], nums[i-1]+money[i-2]);
}
}
return money[nums.length];

}
}

时间: 2024-10-12 20:39:11

Jan 09 - House Robber; DP;的相关文章

Jan 09 - Count Primes; Mathematics; Optimization; Primes; DP;

第一种方法 The Sieve of Eratosthenes is one of the most efficient ways to find all prime numbers up to n. The Sieve of Eratosthenes uses an extra O(n) memory and its runtime complexity is O(n log log n) 创建一个length = n的boolean数组 isPrime,每个元素初始化为true: k = 2

[usaco jan 09] 气象牛 baric [dp]

题面: 传送门 思路: 题意有点绕,实际上就是给你一个计算规则,让你取最少的元素,通过这个计算方式,得到一个小于指定误差上限的结果 这个规则分为三个部分,这里分别用pre,sum,suf表示 因为给定的元素个数(天数)很少,可以使用O(n^3)算法,因此考虑使用经过了预处理的dp解决问题 具体地,设dp[i][j]表示前i个元素使用了j个且一定取用了第i个时可能达到的最小误差值 预处理:pre[i]表示通过第一种计算方式得到的,第一个元素取第i个时得到的误差 suf[i]同理,为第三种计算方式

bzoj 1700: [Usaco2007 Jan]Problem Solving 解题 ——dp

Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场并且象普通人一样找到了工作. 他们的月薪是M (1 <= M <= 1000) 元. 他们的题目是一流的难题,所以他们得找帮手.帮手们不是免费的,但是他们能保证在一个月内作出任何题目.每做一道题需要两比付款, 第一笔A_i(1 <= A_i <= M) 元在做题的那一个月初支付, 第二

BZOJ 3890 Usaco2015 Jan Meeting Time 拓扑图DP

题目大意 题上的中文题意太不明确了... 给出一个拓扑图,每条有向边有两个权值,有两个人从1出发到n,分别走这两种权值.问有没有权值使得这两个人都能走过这些权值到达n. 思路 看懂了题之后就水了.维护两个数组表示从1号节点是否能够通过i的权值到达j.然后做拓扑图DP. CODE #define _CRT_SECURE_NO_WARNINGS #include <queue> #include <cstdio> #include <cstring> #include &l

Jan 09 - Remove Linked List Elements; Linked List; Pointer operation;

数据结构:单向链表.指针操作,注意Null Pointer的情况 以及链表头指针的操作 代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */public class Solution { public ListNode removeElements(ListNode head,

Jan 23 - Decode Ways; DP; Array;

public class Solution { public int numDecodings(String s) { int len = s.length(); if(len == 0) return 0; int[] counts = new int[len]; counts[0] = 0; for(int i = 0; i < len; i++){ int flag = 0; if(i == 0) { if(s.charAt(i) != '0') counts[i] = 1; else c

[BZOJ4506] [Usaco2016 Jan]Fort Moo(DP?)

传送门 总之可以先预处理出来每个位置最多往上延伸多少 枚举两行,看看夹在这两行中间的列最大能构成多大的矩形 可以看出,必须得在一个两行都没有X的区间才有可能构成最大的答案 那么可以把这些区间处理出来,在看看这些区间中的点最左边和最右边的能从下面那一行向上延伸到上面那一行的点,更新ans即可 #include <cstdio> #define N 201 #define max(x, y) ((x) > (y) ? (x) : (y)) int n, m, ans, p; int h[N]

[usaco jan 09] 安全路径 travel [最短路径树]

题面: 传送门 思路: 既然最后一条边不能走,那么就一定是换了一条路,一条不经过这最后一条边的路 如果想要这条路最短,那么其在路上一定尽可能多地走了最短路径 因此,我们对这张图跑一遍从1开始的单源最短路,并建立出最短路径树 那么新的路径(1->u)一定是这样构成的:(1->v)+edge(v,w)+(w->u),其中w是u在最短路径树上的后代 那么,我们对于每一条非树边(u,v),其树上路径上所有点(除了lca)的答案,都可以被dis[u]+dis[v]+w(u,v)-dis[路径上的点

BZOJ_2580_[Usaco2012 Jan]Video Game_AC自动机+DP

Description Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only valid buttons. Bessie may press the buttons in any order she likes; however, there are only N distinct combos possible (1 <= N <= 20). Combo i