C++阶段动态规划

分石子
#include <iostream>
#include <cstdio>
using namespace std;
int dp[105][105],dpb[105][105];
int main(){
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		cin>>dp[i][i];
	}
	//length begin mid
	for(int i=2;i<=n;i++){
		for(int j=1;j<=n-i+1;j++){
			int end=i+j-1;
			dpb[j][end]=0x7f;
			for(int k=j;k<end;k++){//divide
				//begin-k k+1-end
				dp[j][end]=dp[j][k]+dp[k+1][end];
				dpb[j][end]=min(dpb[j][end],dp[j][end]+dpb[j][k]+dpb[k+1][end]);

			}
		}
	}
	cout<<dpb[1][n];
	return 0;
}

  环形ios

#include <iostream>
#include <cstdio>
using namespace std;
int dp[205][205],dpb[205][205],dpc[205][205];
int main(){
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		cin>>dp[i][i];
		dp[i+n][i+n]=dp[i][i];
	}
	//len begin mid
	for(int i=2;i<=n;i++){
		for(int j=1;j<=2*n-i;j++){
			int end=i+j-1;
			dpb[j][end]=999999999;
			for(int k=j;k<end;k++){
				dp[j][end]=dp[j][k]+dp[k+1][end];
				dpb[j][end]=min(dpb[j][end],dp[j][end]+dpb[j][k]+dpb[k+1][end]);
				dpc[j][end]=max(dpc[j][end],dp[j][end]+dpc[j][k]+dpc[k+1][end]);
			}
		}
	}
	int mx=0,mn=99999999;
	for(int i=1;i<=n;i++){ 
		mn=min(mn,dpb[i][n+i-1]);
		mx=max(mx,dpc[i][n+i-1]);
	}
	cout<<mn<<endl<<mx;
	return 0;
}