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;
}
感谢指教!