UVa 10003 Cutting Sticks

        简单DP题。dp(i,j)是i~j这个区间内的最优解,假设下一次在k处分割,dp(i,j)=min(dp(i,k)+dp(k,j))+len(i,j)。


#include <iostream>    
#include <stdio.h>    
#include <cmath>    
#include <algorithm>    
#include <iomanip>    
#include <cstdlib>    
#include <string>    
#include <memory.h>    
#include <vector>    
#include <queue>    
#include <stack>    
#include <map>  
#include <set>  
#include <ctype.h>    
#define INF 1000000  
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
  
using namespace std;  

int a[1010];
int dp[1010][1010];


int main(){
	int l;
	while(cin>>l){
		if(!l)break;
		
		memset(dp,0,sizeof(dp));
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		a[0]=0;a[n+1]=l;
		
		for(int i=2;i<=n+1;i++){
			for(int j=0;j+i<=n+1;j++){
				dp[j][i+j]=dp[j][j+1]+dp[j+1][i+j]+a[i+j]-a[j];
				for(int k=j+1;k<i+j;k++){
					dp[j][i+j]=min(dp[j][i+j],dp[j][k]+dp[k][i+j]+a[i+j]-a[j]);
				}
			}
		}
		printf("The minimum cutting is %d.\n",dp[0][n+1]);	
	}
	return 0;
}


你可能感兴趣的:(dp,uva)