POJ3176-基础DP

很基础的dp题。有一头奶牛想接尽量多的苹果,有w此移动机会。

dp[i][w] = max(dp[i-1][w+1] + 能否吃到苹果 ,dp[i-1][w] + 能否吃到苹果)  //从上一分钟是否移动中选出最大值转移

我开始状态转移方程没写错,但是边界条件总是写不好,不能处理0。并不是这样的,刚刚又看了一下代码,加号的优先级高于位运算!!!

想起来了线段树不用i>>1+1而用i>>1|1 了。。。。

后来今天问了妹子,还是专业dp的妹子稳啊,理清了边界条件一遍就A了。

以后写dp要想好状态转移的过程,想好再写。

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <ctype.h>
 4 #include <cstdlib>
 5 #include <cstdio>
 6 #include <vector>
 7 #include <string>
 8 #include <queue>
 9 #include <stack>
10 #include <cmath>
11 #include <set>
12 #include <map>
13
14 using namespace std;
15
16 int N,M,T,W;
17 int apple[1010],dp[1010][1010];
18 int main()
19 {
20     while(~scanf("%d%d",&T,&W))
21     {
22         int ans = 0;
23         for(int i=0;i<T;i++) scanf("%d",&apple[i]);
24         memset(dp,0,sizeof dp);
25         dp[0][W] = (apple[0]-1)^(W%2);
26         for(int i=1;i<T;i++)
27         {
28             //dp[i][0] = (apple[i]-1) + dp[i-1][0];
29             for(int w = W;w >= 0; w--)
30             {
31                 if(w == W) dp[i][w] = dp[i-1][w] + ((apple[i]-1)^(w%2));
32                 else dp[i][w] = max(dp[i-1][w+1] + ((apple[i]-1)^((w+1)%2)),dp[i-1][w] + ((apple[i]-1)^(w%2)));
33                 ans = max(ans,dp[i][w]);
34             }
35         }
36         memset(dp,0,sizeof dp);
37         dp[0][W] = !((apple[0]-1)^(W%2));
38         for(int i=1;i<T;i++)
39         {
40             //dp[i][0] = (apple[i]-1) + dp[i-1][0];
41             for(int w = W;w >= 0; w--)
42             {
43                 if(w == W) dp[i][w] = dp[i-1][w] + !((apple[i]-1)^(w%2));
44                 else dp[i][w] = max(dp[i-1][w+1] + !((apple[i]-1)^((w+1)%2)),dp[i-1][w] + !((apple[i]-1)^(w%2)));
45                 ans = max(ans,dp[i][w]);
46             }
47         }
48         printf("%d\n",ans);
49     }
50 }
时间: 2024-11-05 12:21:02

POJ3176-基础DP的相关文章

基础dp

队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加深了对dp的理解,但要想搞好dp,还需要多多练习啊. HDU - 1024 开场高能 给出一个数列,分成m段,求这m段的和的最大值,dp[i][j]表示遍历到第i个数,已经划分了j段,对于每一个数有两种决策,加入上一个区间段,自己成为一个区间段,故dp[i][j] = max(dp[i-1][j]+

POJ 3616 Milking Time 基础DP

Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5743   Accepted: 2401 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤

hdu 5586 Sum 基础dp

Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description There is a number sequence A1,A2....An,you can select a interval [l,r] or not,all the numbers Ai(l≤i≤r) will become f(Ai).f(x)=(1890x+143)mod1

基础DP 19道

VJ链接:点击打开链接 基础DP做好了更有益~! 从中得出几个结论: 1. 背包问题所选的物品是没有相关性,是填充性质 2. LIS问题是元素之间有某种关系(多个属性则先排序某个,在依据另一个LIS) 3. TSP组合问题,一般进行状压,求元素的某种序 题目: 1. 最大M子段和 这个很像多维背包问题,有个数限制.同时我们可以发现最后这个元素只能是  i个子段中最后一个子段 dp[i][j]用来表示由前 j项得到的含i个字段的最大值,且最后一个字段以num[j]项结尾. dp[i][j]=max

FatMouse&#39;s Speed 基础DP

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13643    Accepted Submission(s): 6011Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster i

基础DP总结

---恢复内容开始--- 关键词:基础DP问题,LIS,LCS,状压DP 简析 :DP大法好啊,当一个大问题不好解决的时候,我们研究它与其子问题的联系,然后子问题又找它的子问题,如此下去,一直推,一直减小到可以轻而易举求出答案(称为边界).所以解决DP问题就是要推出一个正确的递推式. 一.DP解决基础递推问题 1)斐波那契数列 dp[n] = dp[n-1] + dp[n-2] 边界:dp[0] = 0 , dp[1] = 1 . 2 )Max sum 题目链接 : http://acm.hdu

FatMouse&#39;s Speed ~(基础DP)打印路径的上升子序列

FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are increasing, but the speed

「kuangbin带你飞」专题十二 基础DP

layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathjax: true - kuangbin - 动态规划 传送门 A.HDU1024 Max Sum Plus Plus 题意 给你N个数,然后你分成M个不重叠部分,并且这M个不重叠部分的和最大. 思路 动态规划最大m字段和,dp数组,dp[i][j]表示以a[j]结尾的,i个字段的最大和 两种情况:1.第a[j

训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - 基础DP - Dijkstra - 图论 - 训练指南 Walk Through the Forest UVA - 10917 题意 Jimmy打算每天沿着一条不同的路走,而且,他只能沿着满足如下条件的道路(A,B):存在一条从B出发回家的路径,比

Apple Catching POJ 2385(基础dp)

原题 题目链接 题目分析 基础dp题,按照题意很容易给出dp定义,dp[i][j],表示在i时间内,用j次转移机会得到的最大苹果数.dp转移如下,如果j==0,则dp[i][j]=dp[i-1][j],否则 如果当前位置有苹果dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+1.否则dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]).最后在dp[T][j]里找最大值就行了,(0<=j<=W). 代码 1 #include <iostrea