区间dp——释放囚犯

原文链接:https://www.luogu.com.cn/problem/P1622

区间dp——释放囚犯_第1张图片
AC代码:

#include
#include
#include
#include
#include
using namespace std;
int p,q,a[105];
int dp[105][105],sum[105][105];
vector<int> vec;
int main(){
	int i,j,len,k;
	cin>>p>>q;
	memset(a,0,sizeof(a));
	for(i=0;i<105;i++){
		for(j=0;j<105;j++){
			dp[i][j]=1e8;
		}
		dp[i][i]=0;
	}
	for(i=1;i<=q;i++){
		cin>>a[i];
	}
	sort(a+1,a+q+1);
	for(i=1;i<=q;i++){
		vec.push_back(a[i]-a[i-1]-1);//cout<
	}
	vec.push_back(p-a[i-1]);
	for(i=0;i<vec.size();i++){
		//dp[i][i]=vec[i];
		for(j=i;j<vec.size();j++){
			if(j==i) sum[i][j]=vec[j];
			else sum[i][j]=sum[i][j-1]+vec[j];
			//cout<
		}
	}
	for(len=1;len<vec.size();len++){
		for(i=0;i+len<vec.size();i++){
		    j=i+len;
		    if(len==1){
				dp[i][j]=min(dp[i][j],sum[i][j]);
			}
			else{
				for(k=i;k<j;k++){
					dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+j-i-1+sum[i][j]);
				}
			}
			//cout<
		}
	}
	cout<<dp[0][vec.size()-1]<<endl;
	return 0;
}

你可能感兴趣的:(dp)