1.直线取石子
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 100 #define MAX 1<<30 #define V vector<int> using namespace std; const int n=6; int a[n]={1,5,6,7,3,2}; int sum[n]; int dp[n][n]; int getmin(){ int i,j,v,k; F(v,1,n){ FF(i,n-v){ j=i+v; int tmp=sum[j]-((i>0)?sum[i-1]:0); dp[i][j]=MAX; F(k,i,j){ dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+tmp); } } } return dp[0][n-1]; } int main(){ memset(dp,0,sizeof(dp)); sum[0]=a[0]; int i; F(i,1,n){ sum[i]=sum[i-1]+a[i]; } printf("%d\n",getmin()); return 0; }