挺水的dp,wa了好多次 最后发现是数组开小了。。
题意不好理解
用到了滚动数组优化空间复杂度
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
int p,s,t;
} a[105];
int max(int a,int b,int c)
{
return max(max(a,b),c);
}
int dp[2][105];
bool vis[30005];
int main()
{
int T,K,N;
while (cin>>N>>K>>T)
{
memset(dp,0,sizeof(dp));
for(int i=0; i<N; i++)
{
cin>>a[i].t;
vis[a[i].t]=true;
}
for(int i=0; i<N; i++)
cin>>a[i].p;
for(int i=0; i<N; i++)
cin>>a[i].s;
for(int i=1; i<=T; i++)
{
if(vis[i])
{
for(int k=1; k<=i&&k<=K; k++)
{ int w=0;
for(int p=0; p<N; p++)
{
if(a[p].t==i&&a[p].s==k)
w+=a[p].p;
}
dp[i%2][k]=max(dp[1-i%2][k-1],dp[1-i%2][k],dp[1-i%2][k+1])+w;
}
}
else
{
for(int k=1; k<=i&&k<=K; k++)
{
dp[i%2][k]=max(dp[1-i%2][k-1],dp[1-i%2][k],dp[1-i%2][k+1]);
}
}
}
int ans=0;
for(int i=0; i<=K; i++)
{
if(ans<dp[T%2][i])
ans=dp[T%2][i];
}
cout<<ans<<endl;
}
return 0;
}