codeVS1966 乘法游戏
区间dp。
用f[l][r]代表从l合并到r的最小得分。
显然 r-l<=1时,f[l][r]=0。
对区间dp一直很不熟悉,得多练练了。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 100 + 10; const int inf = 0x3f3f3f3f; int n; int a[maxn],f[maxn][maxn]; int dp(int l,int r) { if(f[l][r]!=inf) return f[l][r]; for(int k=l+1;k<r;k++) f[l][r]=min(f[l][r],dp(l,k)+dp(k,r)+a[l]*a[k]*a[r]); return f[l][r]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++) f[i][i]=f[i][i+1]=0; printf("%d\n",dp(1,n)); return 0; }