C 不平衡數組(線性dp)

題目傳送門

題意: 給你一個長度爲n的數組,你可以對某個a[i]僅進行一次a[i]=a[i]+1的操作,代價是b[i],爲了使所有相鄰的元素不相等,至少需要要花費多少代價?

思路: 典型的dp[i][0/1]的dp,dp[i][0]表示不對a[i]進行操作使得前i個數不同的最小代價,dp[i][1]表示對a[i]進行操作,使得前i個數不同的最小代價。然後我們只需要分析相鄰兩個數之間的關係去確定如何轉移過來就行。

代碼:

#include<bits/stdc++.h>
#define endl '\n'
#define null NULL
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define pii pair<int,int>
#define ull unsigned long long
#define all(x) x.begin(),x.end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read(){int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;}
using namespace std;
const int N=2e6+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const double eps=1e-20;
const double PI=acos(-1);
int a[N],b[N],dp[N][2];
signed main()
{
	int n=read();
	for(int i=1;i<=n;i++)
    {
        a[i]=read();b[i]=read();
    }
    a[0]=-inf;
    dp[1][0]=0;
    dp[1][1]=b[1];
    for(int i=2;i<=n;i++)
    {
        if(a[i-1]==a[i])
        {
            dp[i][0]=dp[i-1][1];
            dp[i][1]=dp[i-1][0]+b[i];
        }
        else if(a[i-1]==a[i]+1)
        {
            dp[i][0]=min(dp[i-1][0],dp[i-1][1]);
            dp[i][1]=dp[i-1][1]+b[i];
        }
        else if(a[i-1]+1==a[i])
        {
            dp[i][0]=dp[i-1][0];
            dp[i][1]=min(dp[i-1][1],dp[i-1][0])+b[i];
        }
        else
        {
            dp[i][0]=min(dp[i-1][0],dp[i-1][1]);
            dp[i][1]=min(dp[i-1][0],dp[i-1][1])+b[i];
        }
    }
    cout<<min(dp[n][0],dp[n][1])<<endl;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章