zoukankan      html  css  js  c++  java
  • 洛谷P1133 教主的花园 动态规划

    洛谷P1133 教主的花园
    动态规划

    这里是环状的,但是我们并不用将他破环成链
    只要枚举第一个点 根据第一个点选择最后一个选择什么就行了
    然后我们进行DP
    注意如果当前是 2 的话要分情况 上一次是上升 1 还是下降 0

    F1[ i ] 表示 第 i 位置的种第 1 种树所能获得的最大价值
    F2[ i ][ 0 ] 表示 第 i 位置的 种第 2 种树 且上次是下降

     1 #include <bits/stdc++.h> 
     2 #define For(i,j,k) for(int i=j;i<=k;i++) 
     3 using namespace std ; 
     4 
     5 const int N = 100011 ; 
     6 int n,ans ; 
     7 int F1[N],F2[N][2],F3[N],num[N][4] ; 
     8 
     9 inline int read() 
    10 {
    11     int x = 0 , f = 1 ; 
    12     char ch = getchar() ; 
    13     while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar(); } 
    14     while(ch>='0'&&ch<='9') { x = x * 10+ch-48 ; ch = getchar(); } 
    15     return x * f ; 
    16 }
    17 
    18 inline void calc() 
    19 {
    20     For(i,2,n) {
    21         if( F2[i-1][1] ) F1[i] = max( F1[i],F2[i-1][1]+num[i][1] ) ; 
    22         if( F3[i-1] )    F1[i] = max( F1[i],F3[i-1]+num[i][1] ) ; 
    23         if( F2[i-1][0] ) F3[i] = max( F3[i],F2[i-1][0]+num[i][3]) ; 
    24         if( F1[i-1] )    F3[i] = max( F3[i],F1[i-1]+num[i][3] ) ; 
    25         if( F1[i-1] )    F2[i][1] = F1[i-1] + num[i][2] ; 
    26         if( F3[i-1] )    F2[i][0] = F3[i-1] + num[i][2];    
    27     }
    28 }
    29 
    30 int main() 
    31 {
    32     n = read() ; 
    33     For(i,1,n) 
    34       num[i][1] = read() ,num[i][2] = read() ,num[i][3] = read() ; 
    35     For(k,1,4) {
    36         memset(F1,0,sizeof F1) ; 
    37         memset(F2,0,sizeof F2) ; 
    38         memset(F3,0,sizeof F3) ;  
    39         if(k==1) F1[ 1 ] = num[ 1 ][ 1 ] ; 
    40         if(k==2) F2[ 1 ][0] = num[ 1 ][ 2 ] ; 
    41         if(k==3) F2[ 1 ][1] = num[ 1 ][ 2 ] ; 
    42         if(k==4) F3[ 1 ] = num[ 1 ][ 3 ] ; 
    43         calc() ; 
    44         if(k==1) ans = max(ans,F3[n]), ans = max(ans,F2[n][1]) ; 
    45         if(k==2) ans = max(ans,F3[n]) ; 
    46         if(k==3) ans = max(ans,F1[n]) ;  
    47         if(k==4) ans = max(ans,F1[n]), ans = max(ans,F2[n][0]) ; 
    48     }    
    49     printf("%d
    ",ans) ; 
    50     return 0 ; 
    51 }
  • 相关阅读:
    博客园添加访问人数统计【转】
    Android环境下通过C框架层控制WIFI【转】
    用户态文件系统fuse学习【转】
    linux内核 RCU机制详解【转】
    使用diff制作补丁【学习笔记】
    OAuth2授权原理
    Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)
    lock关键字只不过是C#提供的语法糖
    关于OATUH中的AUTHRAZITON CODE和TOKEN的关系,实际上就是这么回事
    SQL Server 索引设计指南
  • 原文地址:https://www.cnblogs.com/third2333/p/7215778.html
Copyright © 2011-2022 走看看