• 线性dp,分层图思想


    题目大意:给你一串数字,一串运算符,求递推用完运算符时答案的最大值----->线性dp

    dp[i][j] i表示所用数字的个数   j表示所用字符的个数

    分层图思想

    所有字符必须用完

    所以取最后一层的dp[m][n]

     1 #include<bits/stdc++.h>
     2 #define mp make_pair
     3 #define pb push_back
     4 #define pw(x) (1ll << (x))
     5 #define sz(x) ((int)(x).size())
     6 #define all(x) (x).begin(),(x).end()
     7 #define rep(i,l,r) for(int i=(l);i<(r);i++)
     8 #define per(i,r,l) for(int i=(r);i>=(l);i--)
     9 #define FOR(i,l,r) for(int i=(l);i<=(r);i++)
    10 #define eps 1e-9
    11 #define PIE acos(-1)
    12 #define cl(a,b) memset(a,b,sizeof(a))
    13 #define fastio ios::sync_with_stdio(false);cin.tie(0);
    14 #define lson l , mid , ls
    15 #define rson mid + 1 , r , rs
    16 #define ls (rt<<1)
    17 #define rs (ls|1)
    18 #define INF 0x3f3f3f3f
    19 #define LINF 0x3f3f3f3f3f3f3f3f
    20 #define lowbit(x) (x&(-x))
    21 #define sqr(a) a*a
    22 #define ll long long
    23 #define ull unsigned long long
    24 #define vi vector<int>
    25 #define pii pair<int, int>
    26 #define dd(x) cout << #x << " = " << (x) << ", "
    27 #define de(x) cout << #x << " = " << (x) << "
    "
    28 #define endl "
    "
    29 using namespace std;
    30 //**********************************
    31 int n,m,k;
    32 //**********************************
    33 const int maxn=1e4+7;
    34 char op[10];
    35 ll dpmin[10][maxn],dpmax[10][maxn];
    36 ll cal(ll a,ll b,char op)
    37 {
    38     if(op=='+')return a+b;
    39     if(op=='/')return a/b;
    40     if(op=='*')return a*b;
    41     return a-b;
    42 }
    43 int a[maxn];
    44 //**********************************
    45 int main()
    46 {
    47     int T;
    48     scanf("%d",&T);
    49     while(T--){
    50         cl(dpmax,-LINF);cl(dpmin,LINF);
    51         scanf("%d %d %d",&n,&m,&k);
    52         dpmin[0][0]=dpmax[0][0]=k;
    53         FOR(i,1,n)scanf("%d",&a[i]);
    54         FOR(i,1,m)cin>>op[i];
    55         //分层图思想 
    56         FOR(i,1,m){
    57             FOR(j,1,n){
    58                 //buxuan
    59                 if(j<i)continue;
    60                 dpmin[i][j]=min(dpmin[i][j],dpmin[i][j-1]);
    61                 dpmax[i][j]=max(dpmax[i][j],dpmax[i][j-1]);
    62                 //xuan
    63                 dpmin[i][j]=min(dpmin[i][j],cal(dpmax[i-1][j-1],a[j],op[i]));
    64                 dpmin[i][j]=min(dpmin[i][j],cal(dpmin[i-1][j-1],a[j],op[i]));
    65                 dpmax[i][j]=max(dpmax[i][j],cal(dpmax[i-1][j-1],a[j],op[i]));
    66                 dpmax[i][j]=max(dpmax[i][j],cal(dpmin[i-1][j-1],a[j],op[i]));
    67 //                dd(i);dd(j);de(dpmax[i][j]);
    68 //                dd(i);dd(j);de(dpmin[i][j]);
    69             }
    70         }
    71         printf("%lld
    ",dpmax[m][n]);
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    Nebula通关指南
    hackersonlineclub.com
    PHP设计的超强大的文件上传类(单文件上传)
    PHP面向对象实例(图形计算器)
    DIV+CSS布局网站基本框架
    python的threading模块
    Python 命令行参数和getopt模块详解
    python optparse模块
    python的sys模块
    python实现简单的netcat
  • 原文地址:https://www.cnblogs.com/klaycf/p/9657901.html
Copyright © 2020-2023  润新知