题意:一个二维数组上有些值为0,有些值不为零,一个人从数组外进入数组取这些值,但是必须从大到小拿,每走一步要一单位的时间,取数也要一单位的时间,进入数组和出数组分别要一单位的时间。求在规定的时间内能取到的最大的值(开始在数组外,需在规定的时间内返回数组外)。
分析:我并不知道这题跟dp有多大的关系。做法是把数组从大到小排序,然后遍历这些值,每次计算若取走这个值还剩下的时间,如果剩下的时间不足以返回数组外则退出循环。
代码:
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
int x,y,g;
}a[10000];
bool cmp(node a,node b)
{
return a.g>b.g;
}
int main()
{
int t,m,n,k;
int dp[10000];
cin>>t;
while(t--){
cin>>m>>n>>k;
int u=0;
for(int i=0;i<10000;i++) dp[i]=k;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
cin>>a[u].g;
a[u].x=i,a[u++].y=j;
}
sort(a,a+m*n,cmp);
if(a[0].x*2+3>k) cout<<"0"<<endl;
else{
dp[0]=k-a[0].x-2;
int ans=a[0].g;
for(int i=1;i<m*n;i++){
int tmp=dp[i-1]-abs(a[i].x-a[i-1].x)-abs(a[i].y-a[i-1].y)-1;
if(tmp-a[i].x<1)
break;
else{
dp[i]=tmp;
ans+=a[i].g;
}
}
cout<<ans<<endl;
}
}
}