UVA 10003 Cutting Sticks
题意:在给出的n个结点处切断木棍,并且在切断木棍时木棍有多长就花费多长的代价,将所有结点切断,并且使代价最小。 思路:设DP[i][j]为,从i,j点切开的木材,完成切割需要的cost,显然对于所有DP[i][i+1]=0,记w[i][j]为从i,j点切开的木材的长度,因此可以枚举切割点,dp[i][j]=min(dp[i][k]+dp[k][j])+w[i][j],k就是枚举的切割点. AC代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int SIZEN=55; 6 const int INF=1<<30; 7 int x[SIZEN]; 8 int dp[SIZEN][SIZEN]; 9 int w[SIZEN][SIZEN]; 10 void init() 11 { 12 memset(dp,-1,sizeof(dp)); 13 } 14 int dfs(int l,int r) 15 { 16 if(dp[l][r]!=-1) 17 return dp[l][r]; 18 int ans=INF; 19 for(int i=l+1; i<r; i++) 20 { 21 ans=min(ans,dfs(l,i)+dfs(i,r));