cf Div.3 Round #693 补题总结
1472C - Long Jumps
题目分析:
- 题意:
选择数组的起始位置i, 将物品放在该 (a[i])处。
当 i ≤ n 时,得a[i]分,并物品向右移a[i] 。
当 i > n 时,游戏结束。
求以最优的方式选择起始位置,能得到的最大分数。 - 数据范围:104组测试样例,数组长度2*105
遍历会超时…
那么, DP:
通过选择位置j,可假设我们得到的结果a[j]比选择位置j+a[j]得到的大
公式:score( j ) = score( j + a[ j ] ) + a[ j ]
计算score的所有结果并将它们存储在数组中,利用公式 在 一次操作 中计算出score(i) 。
从末尾开始遍历,在位置 i,我们将知道所有 j > i 的score(j)。
vector<int> dp(n);
for(int i=n-1;i >= 0;i--){
dp[i]=a[i];
int j=i+a[i];
if(j<n) dp[i] += dp[j];
}
cout<<*max_element(dp.begin(),dp.end())<<endl;
D. Even-Odd Game
最优策略:每次取最大,无论奇偶。
注意数据范围
--------------------------------------------------------------分隔符--------------------------------------------------------------
1.5小结
-
《算法基础课》4h
-
AcWing 10题 (795-799,801-803)