线性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) << "\n"
28 #define endl "\n"
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\n",dpmax[m][n]);
72     }
73     return 0;
74 }
View Code

 

转载于:https://www.cnblogs.com/klaycf/p/9657901.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值