[wikioi]能量项链

http://wikioi.com/problem/1154/

这是石子归并的加强版,基本就是分治法的DP。但是有了个环,因为任何一个位置都可开始,所以就建立2*N的数组,然后对可能的区间遍历一次,就是O(n^3)的复杂度。
中间错误的地方有:
# 把dp(i,j)错误写成F[i][j]
# k不能等于i,也不能等于j
# 把A[i]*A[k]*A[j]错写成i*k*j

#include <cstdio>

#include <iostream>

#include <algorithm>

#include <memory.h>

#define MAX(a, b) a>b?a:b

#define LEN 105

using namespace std;

 

int A[LEN*2];

int F[LEN*2][LEN*2];

int N;

 

void init()     

{

    scanf("%d", &N);

    for (int i = 1; i <= N; i++) {

        scanf("%d", &A[i]);

        A[i+N] = A[i];

    }

    for (int i = 1; i <= N*2; i++) {

        for (int j = 1; j <= N*2; j++) {

            F[i][j] = -1;

        }

    }

}   



int dp(int i, int j)  

{

    if (F[i][j] != -1) {

        return F[i][j];

    }

    if (i == j || i+1 == j) return 0;

    int max = 0;

    for (int k = i+1; k <= j-1; k++) {

        int tmp = dp(i, k) + dp(k, j) + A[i]*A[k]*A[j];

        if (tmp > max) max = tmp;

    }

    F[i][j] = max;

    return max;

}

 

int main()

{

    init();

    

    int ans = 0;

    for (int i = 1; i <= N; i++)

    {

        int tmp = dp(i, i+N);

        ans = MAX(tmp, ans);

    }

    printf("%d\n", ans);

    return 0;

}

  

你可能感兴趣的:(IO)