poj 1260 dp

2015/2/12


簡單的10揹包變形


狀態方程


dp[i] = dp[i-1]+(c[i]+10)*v[i];


dp[i] = Min(dp[i],dp[j] + (s[i] - s[j] + 10)*v[i] );


一開始用while(~scanf("%d",&tot)) wa了。。

鬱悶好久。


#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<climits>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>

using namespace std;
typedef long long ll;  

#define mod 10007
#define lson pos<<1,l,mid
#define sc(n) scanf("%d",&n)
#define rson pos<<1|1,mid+1,r
#define pr(n) printf("%d\n",n)
#define met(n,m) memset(n, m, sizeof(n))
#define F(x,y,i) for(int i = x;i > y; i--)
#define f(x,y,i) for(int i = x;i < y; i++)
#define ff(x,y,i) for(int i = x;i <= y; i++)
#define FF(x,y,i) for(int i = x;i >= y; i--) 

const int N=100500;
const int inf = INT_MAX;

int Max(int a,int b)
{
	return a>b?a:b;
}

int Min(int a,int b)
{
	return  a<b?a:b;
}

int v[1005],c[1005],s[1005],dp[1005];


int main()  
{  
    int n, m, tot, x;
    scanf("%d",&tot);
    
    	while(tot--)
    	{
    		met(dp,0);
	    	s[0] = 0 ;
			scanf("%d",&n);
	    	f(1,n+1,i)
	    	{
	    		sc(c[i]);
	    		sc(v[i]);
	    		s[i]=c[i]+s[i-1];
			}
	    	
	    	f(1,n+1,i)
	    	{
	    		dp[i] = dp[i-1]+(c[i]+10)*v[i];
	    		
	    		f(0,i,j)
	    		{
		    		dp[i] = Min(dp[i],dp[j] + (s[i] - s[j] + 10)*v[i] );
		    	}
	    		
	    	}
	    	
	    	printf("%d\n",dp[n]);
	    }
			    	
    
    return 0;  
}  
	


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章