环形DP
在给定数据是环形数组时,我们求解时要将环形变化为线性数组求解,这里有两种常用的变换方式,下面通过例题给出。
例题1
通过对某些特殊位置进行不同初始化,多次DP求解最优解。
休息时间
//环形DP
//通过一定的手段将环形DP转化为线性DP的问题
//本题通过两次DP和错位补充的手段来解决问题
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int b;
scanf("%d %d",&n,&b);
int val[n];
for(int i=0;i<n;i++)scanf("%d",&val[i]);
int dp[2][b+1][2];//很好的一种设计滚动数组的方法,这里通过多添加一维的方式,避免阶段递推顺序的改变
//我们要巧用位运算,来实现快速的0,1变化。
memset(dp,128,sizeof(dp));//很好的一种初始化为最小值的方法,值的学习,哈哈
dp[1][0][0]=0;
dp[1][1][1]=0;
for(int i=2;i<=n;i++){
for(int j=0;j<=min(i,b);j++){
dp[i&1