线性dp,分层图思想
题目大意:给你一串数字,一串运算符,求递推用完运算符时答案的最大值----->线性dp
dp[i][j] i表示所用数字的个数 j表示所用字符的个数
分层图思想
所有字符必须用完
所以取最后一层的dp[m][n]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }