uva10304 Optimal Binary Search Tree(DP)
#include <iostream> #include <cstdio> #define ll long long using namespace std; ll v[300],sum[300]; ll dp[300][300]; int n; ll DP(int x,int y){ if(dp[x][y]!=(ll)1e17) return dp[x][y]; if(x==y) return dp[x][y]=0; ll ret=(ll)1e17; for(int i=x;i<=y;i++){ if(i==x) ret=min(ret,DP(i+1,y)+sum[y]-sum[i]); else if(i==y) ret=min(ret,DP(x,i-1)+sum[i-1]-sum[x-1]); else ret=min(ret,DP(x,i-1)+DP(i+1,y)+sum[y]-sum[x-1]-v[i]); } return dp[x][y]=ret; } int main(){ while(cin>>n){ for(int i=1;i<=n;i++) cin>>v[i]; sum[0]=0; for(int i=1;i<=n;i++) sum[i]=sum[i-1]+v[i]; for(int i=0;i<300;i++){ for(int j=0;j<300;j++){ dp[i][j]=(ll)1e17; } } cout<<DP(1,n)<<endl; } return 0; }