题意:一个二维数组上有些值为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; } } }
时间: 2024-10-20 23:14:33