• Book 动态规划


    虽然之前学过一点点,但是还是不会------现在好好跟着白书1.4节学一下——————

    (1)数字三角形

    d(i,j) = max(d(i+1,j),d(i+1,j+1)) + a[i][j]

    hdu 2084

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring> 
     4 #include <cmath> 
     5 #include<stack>
     6 #include<vector>
     7 #include<map> 
     8 #include<set>
     9 #include<queue> 
    10 #include<algorithm>  
    11 using namespace std;
    12 
    13 typedef long long LL;
    14 const int INF = (1<<30)-1;
    15 const int mod=1000000007;
    16 const int maxn=1000005;
    17 
    18 int d[1005][1005],a[1005][1005];
    19 
    20 int main(){
    21     int T;
    22     scanf("%d",&T);
    23     while(T--){
    24         int n;
    25         scanf("%d",&n);
    26         memset(d,0,sizeof(d));
    27         for(int i = 1;i<=n;i++)
    28             for(int j = 1;j<=i;j++) scanf("%d",&a[i][j]);
    29         
    30         for(int i = n;i>=1;i--){
    31             for(int j = 1;j<=i;j++)
    32             d[i][j] = max(d[i+1][j],d[i+1][j+1]) + a[i][j];
    33         }
    34         printf("%d
    ",d[1][1]);
    35     }
    36     return 0;
    37 }
    View Code

    (2)嵌套矩形

    把图先建出来,然后d(i) = max(d(j) + 1)

    nyoj 16

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring> 
     4 #include <cmath> 
     5 #include<stack>
     6 #include<vector>
     7 #include<map> 
     8 #include<set>
     9 #include<queue> 
    10 #include<algorithm>  
    11 using namespace std;
    12 
    13 typedef long long LL;
    14 const int INF = (1<<30)-1;
    15 const int mod=1000000007;
    16 const int maxn=1000005;
    17 
    18 int g[1005][1005];
    19 int d[1005];
    20 int n;
    21 
    22 struct node{
    23     int x,y;
    24 }a[maxn];
    25 
    26 int dp(int i){
    27     int& ans = d[i];
    28     if(ans > 0) return ans;
    29     ans = 1;
    30     for(int j = 1;j <= n;j++) 
    31     if(g[i][j]) ans = max(ans,dp(j) + 1);
    32     
    33     return ans;
    34 }
    35 
    36 int work(){
    37     int res = -1;
    38     for(int i = 1;i <= n;i++) res = max(res,dp(i));
    39     return res;
    40 }
    41 
    42 int main(){
    43     int T;
    44     scanf("%d",&T);
    45     while(T--){
    46         scanf("%d",&n);
    47         for(int i = 1;i <= n;i++) scanf("%d %d",&a[i].x,&a[i].y);
    48         memset(g,0,sizeof(g));
    49         memset(d,0,sizeof(d));
    50         
    51         for(int i = 1;i <= n;i++){
    52             for(int j = 1;j <= n;j++){
    53                 if((a[i].x > a[j].x && a[i].y > a[j].y) || (a[i].x > a[j].y && a[i].y > a[j].x ))
    54                 g[i][j] = 1;
    55             }
    56         }
    57         
    58         printf("%d
    ",work());
    59     }
    60     return 0;
    61 }
    View Code
  • 相关阅读:
    elasticsearch如何设计索引
    LinkedList 的实现原理
    聊聊elasticsearch7.8的模板和动态映射
    elasticsearch7.8权限控制和规划
    cloudera manager server迁移
    2020年终总结
    工作两年半的一次复盘
    聊聊数据结构和算法
    AutoMapper源码解析
    [源码解析] 并行分布式框架 Celery 之 worker 启动 (2)
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4660004.html
Copyright © 2020-2023  润新知