求教 区间DP怎么写?

P1103 书本整理

这叫区间dp?
by 很性感的人 @ 2017-09-20 19:23:27


```cpp #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstring> using namespace std; struct book { int w,h; }a[110]; int n,k,f[110][110][110],sum[110]; bool cmp(book b1,book b2){return b1.h<b2.h;} int main() { memset(f,0x7f,sizeof f); scanf("%d%d",&n,&k); for (int i=1;i<=n;i++) scanf("%d%d",&a[i].h,&a[i].w); sort(a+1,a+n+1,cmp); for (int i=1;i<=n;i++) f[i][i][0]=0; for (int i=2;i<=n;i++) sum[i]=sum[i-1]+abs(a[i].w-a[i-1].w); for (int i=1;i<n;i++) for (int j=i+1;j<=n;j++) f[i][j][0]=sum[j]-sum[i]; for (int p=1;p<=k;p++) //p是拿掉的书有p本 for (int i=1;i<n;i++) //左端点 for (int j=i+1;j<=n;j++) //右端点 for (int q=i;q<=j;q++) //拿掉第q个 { if (q>i && q<j) { for (int ii=0;ii<=p-1;ii++) f[i][j][p]=min(f[i][q-1][ii]+f[q+1][j][ii]+abs(a[q+1].w-a[q-1].w),f[i][j][p]); } else if (q==i) f[i][j][p]=min(f[i][j][p],f[i+1][j][p-1]); else if (q==j) f[i][j][p]=min(f[i][j][p],f[i][j-1][p-1]); } printf("%d",f[1][n][k]); return 0; } ```
by syh0313 @ 2017-10-19 16:23:38


楼上哪里有错区间dp(忽略复杂度)
by syh0313 @ 2017-10-19 16:24:31


最后写了一个和std对拍有几个点不同的代码 结果A了、、、 ```cpp #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; int n,k,f[110][110],ans=20000313,b[210]; struct book { int w,h; }a[110]; bool cmp(book b1,book b2){return b1.h<b2.h;} int main() { freopen("dp.in","r",stdin); freopen("dp.out","w",stdout); scanf("%d%d",&n,&k); if (n==k || n==k+1) {printf("0"); return 0;} for (int i=1;i<=n;i++) { scanf("%d%d",&a[i].h,&a[i].w); b[a[i].w]++; if (b[a[i].w]==n-k) {printf("0"); return 0;} } sort(a+1,a+n+1,cmp); memset(f,0x7f,sizeof f); for (int i=1;i<=n;i++) f[i][1]=0; for (int p=2;p<=n-k;p++) for (int i=2;i<=n;i++) for (int j=1;j<i;j++) f[i][p]=min(f[i][p],f[j][p-1]+abs(a[j].w-a[i].w)); for (int i=k;i<=n;i++) ans=min(ans,f[i][n-k]); printf("%d",ans); return 0; } ```
by syh0313 @ 2017-10-20 16:26:00


@[友邻牧鸡](/space/show?uid=21192) @ [友邻牧鸡](/space/show?uid=21192)
by syh0313 @ 2017-10-23 08:32:36


#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define maxn 105 using namespace std; int n,k; struct Book{int h,w;}a[maxn]; int f[maxn][maxn]; int abs(int x){return x<0?-x:x;} int dfs(int now,int cnt,int xuan){ if(f[now][cnt]!=-1) return f[now][cnt]; int ans=19260817; if(now==n) return 0; if(n-xuan==k) return 0; if(cnt==k) return f[now][cnt]=dfs(now+1,cnt,xuan+1)+abs(a[now+1].w-a[now].w); for(int i=1;i<=n;i++) if(now+i<=n&&cnt+(i-1)<=k) ans=min(ans,dfs(now+i,cnt+(i-1),xuan+1)+abs(a[now+i].w-a[now].w)); return f[now][cnt]=ans; } bool cmp(Book aaa,Book bbb){return aaa.h<bbb.h;} int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].h,&a[i].w); sort(a+1,a+n+1,cmp); memset(f,-1,sizeof(f)); int ans=19260817; for(int i=1;i<=k+1;i++){ ans=min(ans,dfs(i,i-1,1)); } printf("%d",ans); return 0; }
by zhouzhengye @ 2019-06-05 23:01:25


|