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; }
环形
#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; }