3027 线段覆盖 2

来源:互联网 发布:淘宝 国际驾照 编辑:程序博客网 时间:2024/05/17 07:05
刚开始我写这道题目,我的状态转移方程式是:dp[i][i]=dp[i][k]+dp[k+1][j];

后来才发现  测试数据太大,会导致超时。

接着我又重新梳理了解题的思想, 直接遍历一边可以多选的选项,然后接着用一个Max值存储最大的价值,题目便AC了

先贴出我错误的代码

#include <iostream>using namespace std;void Swap(int a[],int b[]){    int temp;    for(int i=0;i<3;i++)    {        temp=a[i];        a[i]=b[i];        b[i]=temp;    }}int main(){    int n,a[1001][3],dp[1001][1001],d[1001][1001];    cin>>n;    for(int  i=1; i<=n; i++)cin>>a[i][0]>>a[i][1]>>a[i][2];    //按升序排序      /* for(int i=1;i<=n;i++)    {        for(int j=0;j<3;j++)        {            cout<<a[i][j]<<"\t";        }        cout<<endl;    }    cout<<endl;*/    for(int i=1; i<=n; i++)    {        for(int j=n; j>1; j--)        {            if(a[j][0] < a[j-1][0])            {                Swap(a[j],a[j-1]);            }else if(a[j][0]==a[j-1][0]&&a[j][1]>a[j-1][1])            {                Swap(a[j],a[j-1]);            }        }    }   /* for(int i=1;i<=n;i++)    {        for(int j=0;j<3;j++)        {            cout<<a[i][j]<<"\t";        }        cout<<endl;    }    cout<<endl;*/    for(int i=n;i>=1;i--)    {        for(int j=i;j<=n;j++)        {            if(i==j){                d[i][i]=i;                dp[i][i]=a[i][2];            }            for(int k=i;k<j;k++)            {                if(a[d[i][k]][1] > a[k+1][0])                {                    if(dp[i][k] > dp[k+1][j])                    {                        d[i][j]=d[i][k];                        dp[i][j]=max(dp[i][j],dp[i][k]);                    }                    else{                        d[i][j]=d[k+1][j];                        dp[i][j]=max(dp[i][j],dp[k+1][j]);                    }                }                else{                    d[i][j]=d[k+1][j];                    dp[i][j]=dp[i][k]+dp[k+1][j];                }            }        }    }    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            cout<<d[i][j]<<"\t";        }        cout<<endl;    }    cout<<endl;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            cout<<dp[i][j]<<"\t";        }        cout<<endl;    }    cout<<dp[1][n];}

AC的代码:

#include <iostream>#include<algorithm>using namespace std;void Swap(int a[],int b[]){    int temp;    for(int i=0; i<3; i++)    {        temp=a[i];        a[i]=b[i];        b[i]=temp;    }}int main(){    int n,Max=-99,a[1001][3],k=0;    cin>>n;    for(int  i=1; i<=n; i++)cin>>a[i][0]>>a[i][1]>>a[i][2];    for(int i=1; i<=n; i++)    {        for(int j=n; j>1; j--)        {            if(a[j][1] < a[j-1][1])            {                Swap(a[j],a[j-1]);            }else if(a[j][1]==a[j-1][1]&&a[j][0] > a[j-1][0]);        }    }    for(int i=2;i<=n;i++)    {        k=0;        for(int j=1;j<i;j++)        {            if(a[j][1]<=a[i][0])            {                k=max(k,a[j][2]);            }        }        a[i][2]=a[i][2]+k;        Max=max(a[i][2],Max);    }    cout<<Max;}


0 0
原创粉丝点击