刚开始我写这道题目,我的状态转移方程式是:dp[i][i]=dp[i][k]+dp[k+1][j];
AC的代码:
后来才发现 测试数据太大,会导致超时。
接着我又重新梳理了解题的思想, 直接遍历一边可以多选的选项,然后接着用一个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;
}