NYOJ 737:
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
typedef long long LL;
const int maxn = 205;
const LL INF = 0x3f3f3f3f;
LL DP[maxn][maxn];
LL A[maxn];
LL DPS(int l,int r){
if(DP[l][r] != -1) return DP[l][r];
LL& ans = DP[l][r];
ans = INF;
LL L = 0,R = 0;
for(int i = l;i <= r;++i) R += A[i];
for(int k = l;k < r;++k){
L += A[k],R -= A[k];
ans = min(ans,L + R + DPS(l,k) + DPS(k + 1,r));
}
return ans;
}
int main(){
int n;
while( ~sf("%d",&n) ){
for(int i = 0;i < n;++i) sf("%lld",A + i);
memset(DP,-1,sizeof(DP));
for(int i = 0;i < n;++i) DP[i][i] = 0;
DPS(0,n - 1);
pf("%lld\n",DP[0][n - 1]);
}
return 0;
}
POJ 2955:
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 105;
int DP[maxn][maxn];
char s[maxn];
int DPS(int l,int r){
if(~DP[l][r]) return DP[l][r];
int& ans = DP[l][r];
ans = INF;
if(s[l] == '(' && s[r] == ')' || s[l] == '[' && s[r] == ']') ans = min(ans,DPS(l + 1,r - 1));
for(int k = l;k < r;++k){
ans = min(ans,DPS(l,k) + DPS(k + 1,r));
}
return ans;
}
int main(){
while(sf("%s",s)){
if(s[0] == 'e') break;
int len = strlen(s);
memset(DP,-1,sizeof(DP));
for(int i = 0;i < len;++i){
DP[i][i] = 1;
DP[i + 1][i] = 0;
}
pf("%d\n",len - DPS(0,len - 1));
}
return 0;
}
NYOJ 746:
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
typedef long long int LL;
const int maxn = 20;
LL DP[maxn][maxn][maxn];
LL G[maxn],F[maxn];
int len;
char s[maxn];
LL DPS(int l,int r,int m){
if(~DP[l][r][m]) return DP[l][r][m];
LL& ans = DP[l][r][m] = 0;
if(r - l + 1 < m) ans = 0;
else if(m == 1){
ans = G[l] / F[r + 1];
}
else for(int k = l;k < r;++k){
for(int p = 1;p <= m;++p){
for(int q = 1;q <= m;++q){
if(p + q == m){
ans = max(ans,DPS(l,k,p) * DPS(k + 1,r,q));
}
}
}
}
return ans;
}
int main(){
int T;sf("%d",&T);
while( T-- ){
memset(DP,-1,sizeof(DP));
int n,m;
sf("%s %d",s,&m);
len = n = strlen(s);
F[len] = 1;
G[len] = 0;
for(int i = len - 1;~i;--i) {
F[i] = F[i + 1] * 10;
G[i] = G[i + 1] + (s[i] - '0') * F[i + 1];
}
pf("%lld\n",DPS(0,n - 1,m));
}
return 0;
}