区间dp(石子合并and括号匹配)

就是把大区间划分为小区间然后取小区间的最优值

处理石子合并和括号匹配

(1). 石子合并

①.n堆石子,每堆有a[i]个,每次合并两堆,需要体力为相邻两堆石子之和

每次合并最小的两堆就好了

SDNUOJ1013石子合并简化版

[cpp]  view plain  copy
  1. #include  
  2. #include  
  3. #include  
  4. #include  
  5. using namespace std;  
  6. int main()  
  7. {  
  8.     int n;  
  9.     int sum;  
  10.     int x[10010];  
  11.     while(cin>>n&&n != 0)  
  12.     {  
  13.         sum = 0;  
  14.         memset(x, 0, sizeof(x));  
  15.         for(int i = 0; i < n; i++)  
  16.             cin>>x[i];  
  17.         sort(x, x+n);  
  18.         for(int i = n-1; i > 0; i--)  
  19.         {  
  20.             x[i-1] = x[i-1] + x[i];  
  21.             sum=(sum % 1000000007 + x[i-1] % 1000000007) % 1000000007;  
  22.         }  
  23.         cout<
  24.     }  
  25.     return 0;  
  26. }  

②.n堆石子直线排列,每堆有a[i]个,每次合并相邻两堆,需要体力为相邻两堆石子之和

sum[i]是前i堆总的石子个数

状态方程:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]);

[cpp]  view plain  copy
  1.   
[cpp]  view plain  copy
  1. /*for(int i = 0; i < n; i++) 
  2.     dp[i][i]=0;*/  
  3. for(int t = 1; t < n; t&#

你可能感兴趣的:(动态规划,石子合并,括号匹配,区间dp)