hdu 4960 Another OCD Patient dp(记忆化搜索)
2014-08-20 12:34
633 查看
题意:
给定一个n长的序列vi,现在要求合并连续子序列,使得最终的序列式一个回文序列。每次合并i长的子序列,需要花费ai。求最小花费。
题解:
由于要变成回文,所以开头和结尾要合并成相同的值,抛去已经合并的开头和结尾,又要合并相同的值,如此反复知道这个序列都变成了回文。
根据上述的性质,我们可以发现,每个要合并的两个点(,i,j),必定sum(1,i)==sum(j,n)。所以所有的符合点对都是一一对应的。我们可以用一个结构体储存这些符合点对。然后通过dp式子dp[i][j]=min(dp[i'][j]'+a[i'-i+1]+a[j-j'+1])求得答案,由于数据量很大,需要用到记忆化搜索。
还是没弄懂别人15MS是怎么跑出来的,哎。。。。。
代码:
给定一个n长的序列vi,现在要求合并连续子序列,使得最终的序列式一个回文序列。每次合并i长的子序列,需要花费ai。求最小花费。
题解:
由于要变成回文,所以开头和结尾要合并成相同的值,抛去已经合并的开头和结尾,又要合并相同的值,如此反复知道这个序列都变成了回文。
根据上述的性质,我们可以发现,每个要合并的两个点(,i,j),必定sum(1,i)==sum(j,n)。所以所有的符合点对都是一一对应的。我们可以用一个结构体储存这些符合点对。然后通过dp式子dp[i][j]=min(dp[i'][j]'+a[i'-i+1]+a[j-j'+1])求得答案,由于数据量很大,需要用到记忆化搜索。
还是没弄懂别人15MS是怎么跑出来的,哎。。。。。
代码:
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <iostream> #include <algorithm> #include <queue> #include <map> #include <set> #include <vector> #include <cctype> using namespace std; #define LL __int64 const int maxn=5e3+10; struct node{ int l,r; }e[maxn]; int t; int dp[maxn][maxn],a[maxn],v[maxn]; LL sum[maxn]; int dfs(int l,int r,int i) { if(dp[l][r]!=-1)return dp[l][r]; if(l>=r)return dp[l][r]=0; dp[l][r]=a[r-l+1]; for(;i<t;i++) dp[l][r]=min(dp[l][r],a[e[i].l-l+1]+a[r-e[i].r+1]+dfs(e[i].l+1,e[i].r-1,i+1)); return dp[l][r]; } int main() { int n; while(scanf("%d",&n)!=EOF) { if(n==0)break; int i,j,k,p,q; sum[0]=0; for(i=1;i<=n;i++) { scanf("%d",&v[i]); sum[i]=sum[i-1]+v[i]; } t=0; p=1; for(q=n;q>=1;q--) { while(p<q&&sum[p]-sum[0]<sum -sum[q-1])p++; if(p==q)break; if(sum[p]-sum[0]==sum -sum[q-1]) { e[t].l=p; e[t++].r=q; } } //for(i=0;i<t;i++)printf("%d %d %d\n",i,e[i].l,e[i].r); for(i=1;i<=n;i++)scanf("%d",&a[i]); memset(dp,-1,sizeof(dp)); printf("%d\n",dfs(1,n,0)); } return 0; }
相关文章推荐
- hdu 4960 Another OCD Patient dp(记忆化搜索)
- hdu 4960 Another OCD Patient(DP)
- HDU 4960 Another OCD Patient(记忆化搜索)
- 【HDU】4960 Another OCD Patient 【DP】
- HDU 4960(Another OCD Patient-区间dp)
- HDU 4960 Another OCD Patient (dp)
- hdu 4960 Another OCD Patient 多校九 区间DP
- HDU 4960 Another OCD Patient(DP)
- hdu 4960 Another OCD Patient(dp)
- HDU 4960 Another OCD Patient(记忆化搜索)
- Another OCD Patient HDU - 4960 (dp+前缀和)
- HDU 4960 Another OCD Patient (记忆化搜索)
- hdu 4960 Another OCD Patient(dp)2014多校训练第9场
- HDU_4960 2014多校9 Another OCD Patient DP
- hdu 4960 Another OCD Patient(dp)2014多校训练第9场
- HDU-4960 Another OCD Patient (DP)
- HDU 4960 Another OCD Patient
- hdu 4960 Another OCD Patient(动态规划)
- hdu 4960 Another OCD Patient(记忆化)
- 【DP】 HDOJ 4960 Another OCD Patient