四月该做的事情
- 每周一套cf题
- python 入门
把实验都做完吧,还有课程
习题巩固
石子归并 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
",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];
}