NYOJ 536 开心的mdd(区间DP)

题目链接

经典的区间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 }

 

你可能感兴趣的:(dp)