四月份该做的事情

四月该做的事情

  1. 每周一套cf题
  2. python 入门
  3. 把实验都做完吧,还有课程

习题巩固

石子归并 https://www.lintcode.com/problem/stone-game/description

int stoneGame(vector<int> &A) {
    int l = A.size();
    int dp[510][510]={0};
    long long sum[510][510]={0};
    for(int i=0; i<l; i++)
        for(int j=i; j<l; j++) {
            sum[i][j] = sum[i][j-1] + A[j];
            // printf("sum[%d][%d]: %d ",i,j,sum[i][j]);
            // if(j == l-1) puts("");
        }
    for(int len=2; len<=l; len++) {
        for(int i=0; i+len-1 <l; i++) {
            int j = i+len-1;
            long long mn = 0x3f3f3f3f;
            for(int k=i; k<j; k++) {
                mn = min(mn, dp[i][k] + dp[k+1][j] + sum[i][j]);
                //printf("%d, %d, %d %d %lld\n",i,j,dp[i][j],dp[i+1][j],dp[i][j] + dp[j+1][k] + sum[i][j]);
            }
            dp[i][j] = (int)mn;
            //printf("dp[%d][%d]: %d ",i,j,dp[i][j]);
           // if(j == l-1) puts("");
        }
    }
    return dp[0][l-1];
}

吹气球 https://www.lintcode.com/problem/burst-balloons/description
有n个气球,编号为0到n-1,每个气球都有一个分数,存在nums数组中。每次吹气球i可以得到的分数为 nums[left] * nums[i] * nums[right],left和right分别表示i气球相邻的两个气球。当i气球被吹爆后,其左右两气球即为相邻。要求吹爆所有气球,得到最多的分数。

dp[i][j] 表示 区间[i,j]的都被打爆的最大收益
那么 dp[i][j] = max(dp[i][k-1] + dp[k+1][j] + s[i-1] * s[k] * s[j+1])

int maxCoins(vector<int>& nums) {
    int l = nums.size();
    int s[l+2];
    s[0] = 1, s[l+1] = 1;
    for(int i=0; i<l; i++)
        s[i+1] = nums[i];
    int dp[l+5][l+5] = {0};
    for(int i=1; i<=l; i++)
        dp[i][i] = s[i-1]*s[i]*s[i+1];
    for(int len=2; len<=l; len++) {
        for(int i=1; i+len-1<=l; i++) {
            int j = i+len-1;
            // [i.j]
            int mx = 0;
            for(int k=i; k<=j; k++) {
                mx = max(mx, dp[i][k-1] + dp[k+1][j] + s[i-1] * s[k] * s[j+1]);
            }
            dp[i][j] = mx;
        }
    }
    return dp[1][l];
}
posted @ 2019-03-31 18:38  Draymonder  阅读(234)  评论(0编辑  收藏  举报