石子歸併 -記憶華搜尋or區間DP
阿新 • • 發佈:2018-12-13
石子歸併
記憶化搜尋:
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define maxn 111 int dp[maxn][maxn]; int sum[maxn],n,a; int dfs(int l,int r) { if(l==r)return 0; if(dp[l][r]!=inf) return dp[l][r]; for(int i=l; i<r; i++) dp[l][r]=min(dp[l][r],dfs(l,i)+dfs(i+1,r)+sum[r]-sum[l-1]); return dp[l][r]; } int main() { cin>>n; for(int i=1; i<=n; i++) { cin>>a; sum[i]=sum[i-1]+a; } memset(dp,inf,sizeof(dp)); cout<<dfs(1,n)<<endl; return 0; }
區間dp:
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define maxn 111 int dp[maxn][maxn]; int sum[maxn],n,a; int main() { cin>>n; memset(dp,inf,sizeof(dp)); for(int i=1; i<=n; i++) { cin>>a; sum[i]=sum[i-1]+a; dp[i][i]=0; } for(int len=1; len<n; len++) for(int i=1; i+len<=n; i++) for(int j=i; j<i+len; j++) dp[i][i+len]=min(dp[i][i+len],dp[i][j]+dp[j+1][i+len]+sum[i+len]-sum[i-1]); cout<<dp[1][n]<<endl; return 0; }