UVa 10003 Cutting Sticks

1163 단어 dpuva
단순 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.
",dp[0][n+1]); } return 0; }

좋은 웹페이지 즐겨찾기