Uva 6430 - Points ...简单DP

原创 2013年12月04日 21:49:50

               题意:

                       有N(N<=10^6)个target排成一列(标号为1~N)..现在要选择一些target..并且告诉对于每个target..其得分的方式..对于选了第i个target得分

                            1、若其左右没有一个target被选择...得ai分

                            2、若其左右中有一个target被选择.,.得bi分

                            3、若其左右中无一个target被选择...得ci分

                       问能得到的最大分数...

               题解:

                       由于影响一个位置的取值分数仅与其右边和做边的点有关..所以可以用dp[i][x][y]代表扫到了第i个..第i个target是否选择了..第i-1个target是否选择了的最大值..

 

Program:

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <string.h>
#define oo 1000000007
#define MAXN 1000500
using namespace std;
int dp[2][2][2],a[MAXN],b[MAXN],c[MAXN];
int turn(int l,int x,int r)
{
       if (!l && !r) return a[x];
       if (l+r==1) return b[x];
       return c[x];
}
int main()
{
       int N,t,i,j,x,k,ans; 
       while (~scanf("%d",&N))
       {
               a[0]=b[0]=c[0]=0;
               for (i=1;i<=N;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]);
               c[1]=c[N]=-oo;
               if (N==1) b[1]=-oo;
               memset(dp[0],-0x3f,sizeof(dp[0]));
               dp[0][0][0]=0;
               k=ans=0;
               for (t=1;t<=N+1;t++)
               {
                       k=1-k;
                       memset(dp[k],-0x3f,sizeof(dp[k]));
                       for (x=0;x<2;x++)
                         for (i=0;i<2;i++)
                           for (j=0;j<2;j++)
                           {
                                  if (i) //别忘了...
                                       dp[k][i][j]=max(dp[k][i][j],dp[1-k][x][i]+turn(x,t-1,j));
                                    else
                                       dp[k][i][j]=max(dp[k][i][j],dp[1-k][x][i]);
                                  ans=max(ans,dp[k][i][j]);
                           }
               }
               printf("%d\n",ans);

       }
       return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

uva11324(tarjan缩点 + DAG图上的简单dp)

思路:先缩点,再构图,最后dp。dp[u] = max(dp[u],dfs(v) + val[u]); #include #include #include #include #includ...
  • KIJamesQi
  • KIJamesQi
  • 2015年10月02日 14:03
  • 504

最优矩阵链乘(动态规划dp)POJ 1651 Multiplication Puzzle

大体题意: 一个n*m的矩阵由n行m列共n*m排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个n*m的矩阵乘m*p的矩阵,运算量为n*m*p。 矩阵乘法不满足分配律,但满足结合律...
  • aozil_yang
  • aozil_yang
  • 2016年10月09日 20:18
  • 608

UVA 674 —— 简单DP

674 - Coin Change Time limit: 3.000 seconds   Coin Change  Suppose there are ...
  • zkzxmzk
  • zkzxmzk
  • 2013年11月04日 17:39
  • 349

UVA 6624(简单概率dp)

本题目的意思很简单,但读了N久,才明白... 一个序列由 2 - 10 , J , Q , K , A ,构成 (其中 J , Q , K 代表10, A代表 11) 现在选定m为第一次第一个被选...
  • playwfun
  • playwfun
  • 2015年09月01日 21:07
  • 226

uva 4256题解(简单dp)

题干是给定n个点连通图和一个序列,修改尽量少的书,使得序列中的任意两个相邻数或相等,或相连 思路是用d[i][j]表示以j结尾的前i个数的最小修改次数,那么最后的答案为min(d[n][j]) 状态总...
  • u014664226
  • u014664226
  • 2015年05月07日 23:26
  • 313

大坑!Codeforce DP题总结(持续更新)

个人非常喜欢做DP题,因为DP题有着特殊的数学美感持续不断吸引着我
  • rrtyui
  • rrtyui
  • 2014年09月22日 23:25
  • 2143

概率dp入门的简单题(hdu 4405,牡丹江,codeforces)

最近学习了一下概率dp,感觉没有想象中的那么难。主要还是状态的转移方程的构建。 对于”求概率正推,求期望反推“这句话有了初步的理解。期望的意思是说你现在处在一个状态,还需要几步到达最终状态,这是一个期...
  • NK_test
  • NK_test
  • 2015年05月07日 23:58
  • 725

DP算法(Dynamic Programming,俗称动态规划)是最经典算法之一

DP算法(Dynamic Programming,俗称动态规划)是最经典算法之一.本笔记以耳熟能详的数塔问题为引子,深入讨论01背包的解决方法.   首先,如下图所示,要求从顶层走到底层,若每一...
  • zh123456zh789
  • zh123456zh789
  • 2017年02月16日 23:13
  • 813

杭电60道DP问题总结(一)

杭电60道DP问题总结: DP是一个很有艺术的思想。看似简单的背后却隐藏着深刻的含义。 题目连接地址:http://acm.hdu.edu.cn/problemclass.php?id=5...
  • xueerfei008
  • xueerfei008
  • 2013年06月21日 22:59
  • 10292

插头DP——从不会到入门(POJ 2411,HDU 1565,HDU 2167,HDU 1693,Ural 1519)

#include #include #include #include using namespace std; #define LL long long const int maxn=10...
  • kbdwo
  • kbdwo
  • 2013年11月10日 17:01
  • 9910
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Uva 6430 - Points ...简单DP
举报原因:
原因补充:

(最多只允许输入30个字)