後來才發現 測試數據太大,會導致超時。
接着我又重新梳理了解題的思想, 直接遍歷一邊可以多選的選項,然後接着用一個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;
}