1. 程式人生 > >田忌賽馬 poj 2287 (貪心,動態規劃,貪心+動態規劃)

田忌賽馬 poj 2287 (貪心,動態規劃,貪心+動態規劃)

      題目連結

貪心 ;1:如果田忌的最快馬快於齊王的最快馬,比一場

           2: 如果田忌的最快馬慢於齊王的最快馬,則用田忌的最慢馬和齊王的最快馬比賽一場

          3: 如果田忌的最快馬和齊王的最快馬一樣快,則比較田忌的最慢馬和齊王的最慢馬分兩種情況

          (1) 若田忌的最慢馬快於齊王的最慢馬,田忌的慢馬和齊王的慢馬進行比較

           (2 ) 否則就拿田忌的最慢馬和齊王的最慢快馬比

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<math.h>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    #include<vector>
    #include<string>
    #include<iostream>
    #include<algorithm>
    #include<utility>
    #include<iomanip>
    #include<time.h>
    typedef long long ll;
    const double Pi = acos(-1.0);
    const int N = 1e6+10, M = 1e3+20, mod = 1e9+7, inf = 2e9+10;
    const double e=2.718281828459 ;
    const double esp=1e-9;
    using namespace std;
    int n;
    int a[M],b[M];

    int  main()
    {
        while(~scanf("%d",&n)&&n)
        {
            for(int i=0; i<n; i++)
                scanf("%d",&a[i]);
            for(int i=0; i<n; i++)
                scanf("%d",&b[i]);
            sort(a,a+n);
            sort(b,b+n);
            int min1=0,min2=0;
            int max1=n-1,max2=n-1;
            int sum=0;
            while(n--)
            {
                if(a[max1]>b[max2])
                {
                    sum+=200;
                    max1--;
                    max2--;
                }
                else if(a[max1]<b[max2])
                {
                    sum-=200;
                    min1++;
                    max2--;
                }
                else
                {
                    if(a[min1]>b[min2])
                    {
                        sum+=200;
                        min1++;
                        min2++;
                    }
                    else if(a[min1]<b[max2])
                    {

                        sum-=200;
                        min1++;
                        max2--;
                    }
                }
            }
            printf("%d\n",sum);
        }
        return 0;
    }
動態規劃:

程式碼:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
#include<utility>
#include<iomanip>
#include<time.h>
typedef long long ll;
const double Pi = acos(-1.0);
const int N = 1e6+10, M = 1e3+20, mod = 1e9+7, inf = 2e9+10;
const double e=2.718281828459 ;
const double esp=1e-9;
using namespace std;
int n;
int a[M],b[M];
int f[M][M];
int S(int i,int j)
{
    if(a[i]>b[j]) return 1;
    else if(a[i]<b[j]) return -1;
    else return 0;
}
int  main()
{
    while(~scanf("%d",&n)&&n)
    {
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        for(int i=1; i<=n; i++)
            scanf("%d",&b[i]);
        sort(a+1,a+n+1,greater<int>());
        sort(b+1,b+n+1,greater<int>());
        memset(f,-100,sizeof(f));
        f[0][0]=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=0; j<=n; j++)
            {
                if(j==0)
                    f[i][j]=max(f[i][j],f[i-1][j]+S(i-j,i));
                else
                    f[i][j]=max((f[i-1][j-1]+S(n-j+1,i)),(f[i-1][j]+S(i-j,i)));
            }
        }
        int maxn=f[n][0];
        for(int i=1; i<=n; i++)
        {
            maxn=max(maxn,f[n][i]);
        }
        printf("%d\n",maxn*200);
    }
    return 0;
}