Transmission Door
Interval DP, enumerating the last steps k , for multiplication, the answer is
d P[I,k]?d P[k+1,R] , because the allocation rate will multiply.
If it's an addition, then it's d P[I][k]?(J?k?1)!+d P[k+1][J]?(k?I)! , subtraction is the same.
and finally multiply C (J?I?1,k?I)
#include <bits/stdc++.h>using namespace STD;#define PRT (k) cerr<< #k "=" <<k<<endltypedef Long Longlltypedef Long LongLL;Constll mod =1e9+7;Const intN =233; ll A[n];CharOp[n];ll Dp[n][n];intN;ll F[n];ll C[n][n];intMain () { for(intI=0; i<n;i++) for(intj=0; j<=i;j++) {if(I==j | | j==0) C[i][j] =1;ElseC[I][J] = (c[i-1][j-1] + c[i-1][J])% MoD; } f[0] =1; for(intI=1; i<n;i++) F[i] = f[i-1] * I% mod; while(scanf("%d", &n) = =1) {memset(DP,0,sizeofDP); for(intI=1; i<=n;i++)scanf("%i64d", &dp[i][i]);scanf('%s ', op+1); for(intL =2; L <= N; L + +) for(intI=1; i+l-1<=n;i++) {intj = i + L-1; DP[I][J] =0; for(intk=i;k<j;k++) {ll t;if(op[k]==' * ') T = dp[i][k] * dp[k+1][J]% MoD;if(op[k]==' + ') T = (dp[i][k]*f[j-k-1] + dp[k+1][J] * f[k-i])%mod;if(op[k]=='-') T = (dp[i][k]*f[j-k-1]-dp[k+1][J] * f[k-i])%mod; DP[I][J] = (Dp[i][j] + t * c[j-i-1][k-i])% MoD; } }printf("%i64d\n", (dp[1][n] + MoD)%mod); }}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
HDU 5396 Expression