经典的区间DP问题,求解矩阵乘法的次数。按记忆化搜索写的。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <queue> 5 using namespace std; 6 #define N 100 7 int x[N+1],y[N+1]; 8 long long dp[101][101]; 9 long long dfs(int L,int R) 10 { 11 long long minz; 12 int i; 13 if(dp[L][R] > 0) 14 return dp[L][R]; 15 if(L == R) 16 return 0; 17 minz = dfs(L+1,R)+x[L]*y[L]*y[R]; 18 for(i = L+1; i <= R-1; i ++) 19 { 20 if(minz > dfs(L,i)+dfs(i+1,R)+x[L]*y[i]*y[R]) 21 minz = dfs(L,i)+dfs(i+1,R)+x[L]*y[i]*y[R]; 22 } 23 dp[L][R] = minz; 24 return minz; 25 } 26 int main() 27 { 28 int n,i; 29 while(scanf("%d",&n)!=EOF) 30 { 31 memset(dp,0,sizeof(dp)); 32 for(i = 1; i <= n; i ++) 33 scanf("%d%d",&x[i],&y[i]); 34 printf("%lld\n",dfs(1,n)); 35 } 36 return 0; 37 }