大佬们帮忙看看,感觉思路没有问题
  • 板块P1103 书本整理
  • 楼主北京
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/2/8 09:04
  • 上次更新2023/11/5 03:34:06
查看原帖
大佬们帮忙看看,感觉思路没有问题
322285
北京楼主2021/2/8 09:04

dp[i][j]表示前i本书去掉j本书的最优解,g[i][j]表示前i本书去掉j本书的最优解最后一本书的宽度

核心代码:

for(int i=1;i<=n;++i)
		for(int j=1;j<=k;++j)
		{
			dp[i][j]=dp[i-1][j]+b[i].w-g[i-1][j],g[i][j]=b[i].w;
			if(dp[i-1][j-1]+g[i-1][j-1]<dp[i][j])
				dp[i][j]=dp[i-1][j-1],g[i][j]=g[i-1][j-1];
		}

大样例过了,一提交全挂......

所以问题究竟出在哪里?求教大佬

整份代码如下:

//P1103 书本整理
#include<bits/stdc++.h>
using namespace std;
long long dp[100+10][100+10];
int g[1000+10][1000+10];
struct book
{
	int h,w;
}b[100+10];
bool cmp(const book a,const book b)
{
	return a.h<b.h;
}
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;++i)
		cin>>b[i].h>>b[i].w;
	
	sort(b+1,b+n+1,cmp);
	for(int i=2;i<=n;++i)
		dp[i][0]=dp[i-1][0]+abs(b[i].w-b[i-1].w);
	
	for(int i=1;i<=n;++i)
		for(int j=1;j<=k;++j)
		{
			dp[i][j]=dp[i-1][j]+b[i].w-g[i-1][j],g[i][j]=b[i].w;
			if(dp[i-1][j-1]+g[i-1][j-1]<dp[i][j])
				dp[i][j]=dp[i-1][j-1],g[i][j]=g[i-1][j-1];
		}
	
	//for(int i=1;i<=n;++i)
	//{
	//	for(int j=0;j<=k;++j)
	//		cout<<dp[i][j]<<' ';
	//	cout<<endl;
	//}
	cout<<dp[n][k];
	return 0;
}

感谢指教!

2021/2/8 09:04
加载中...