hdu 1355--似乎并不是dp

来源:互联网 发布:禁止暴风影音访问网络 编辑:程序博客网 时间:2024/05/16 23:58

题意:一个二维数组上有些值为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;    }}}


0 0
原创粉丝点击