poj 1948 Triangular Pastures dp

来源:互联网 发布:2017中超守门员数据 编辑:程序博客网 时间:2024/05/21 11:17
dp[i][j]=1表示能够拼接成第一条边为i,第二条边为j的三角形。
状态转移:
    dp[i+a[k]][j]=1 if dp[i][j]=1;
    dp[i][j+a[k]]=1 if dp[i][j]=1;

一点简单的优化 因为三角形的最大的边长不能超过总边长一半,所以最大状态就是边长的一半。


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
const int maxn=41;
int a[maxn],dp[881][881];
int sum,ans;

void work(int a1,int a2,int a3)
{
    doublep=(a1+a2+a3)/2.0;
   p=p*(p-a1)*(p-a2)*(p-a3);
    if(p<=0)return;
    int s=sqrt(p)*100;
   if(s>ans)
    ans=s;
}

int main()
{
    int n;
   scanf("%d",&n);
    for(inti=1;i<=n;i++)
    {
       scanf("%d",&a[i]);
       sum+=a[i];
    }
    inttmp=sum>>1;
    dp[0][0]=1;
    for(intk=1;k<=n;k++)
    for(inti=tmp;i>=0;i--)
    for(intj=tmp;j>=0;j--)
    if(dp[i][j])
    {
       dp[i+a[k]][j]=1;
       dp[i][j+a[k]]=1;
    }
    ans=-1;
    for(inti=1;i<=tmp;i++)
    for(intj=1;j<=tmp;j++)
    if(dp[i][j])
    work(i,j,sum-i-j);

   printf("%d\n",ans);
    return 0;
}

原创粉丝点击