1 条题解

  • 0
    @ 2026-8-7 10:39:24

    神奇的 dp 优化,我至今没见过(奇怪的知识增加了)。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=2e5+10;
    int mx[N],mx2[N],col[N],a[N],b[N],dp[N][510];
    signed main()
    {
    	int n,k;cin>>n>>k;
    	for(int i=1;i<=n;i++)cin>>a[i]>>b[i];n++;
    	for(int i=1;i<=n;i++)mx[i]=mx2[i]=-1e18;
    	for(int i=1;i<=n;i++)for(int j=0;j<=min(i-1,k);j++)
    	{
    		if(col[i-j-1]==a[i])
    			dp[i][j]=mx2[i-j-1]+b[i];
    		else dp[i][j]=mx[i-j-1]+b[i];
    		if(col[i-j]==a[i])
    		{
    			if(dp[i][j]>mx[i-j])mx[i-j]=dp[i][j];
    		}
    		else
    		{
    			if(dp[i][j]>mx[i-j])mx2[i-j]=mx[i-j],mx[i-j]=dp[i][j],col[i-j]=a[i];
    			else if(dp[i][j]>mx2[i-j])mx2[i-j]=dp[i][j];
    		}
    	}
    	if(dp[n][k]<0)cout<<-1;
    	else cout<<dp[n][k];
    	return 0;
    }
    • 1

    信息

    ID
    2598
    时间
    5000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    4
    已通过
    4
    上传者