|Tyvj|NOIP2000|动态规划|P1047 乘积最大

http://tyvj.cn/p/1047

PS:此题可以不用高精度AC(数据水)

#include <cstdio>  
#include <cstring>   
#include <algorithm> 
#define ms(i,j) memset(i, j, sizeof(i)); 
using namespace std;
typedef long long ll;
int a[50][50];
ll f[10][50]; //设f[k][n]为前n个数k个乘号时的最大乘积 
//f[k][i] = max(f[k-1][j]*a[j+1][i])
int main()  
{  
<span style="white-space:pre">	</span>int n,K;
<span style="white-space:pre">	</span>ll s;
<span style="white-space:pre">	</span>scanf("%d%d%lld", &n, &K, &s);
<span style="white-space:pre">	</span>int i = n;
<span style="white-space:pre">	</span>while (s!=0)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>a[i][i] = s % 10;
<span style="white-space:pre">		</span>s /= 10;
<span style="white-space:pre">		</span>i--;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>for (int i=1;i<=n;i++)
<span style="white-space:pre">	</span>for (int j=i+1;j<=n;j++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>a[i][j] = a[i][j-1] * 10 + a[j][j]; 
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>ms(f,0);
<span style="white-space:pre">	</span>for (int i=1;i<=n;i++) f[0][i] = a[1][i];
<span style="white-space:pre">	</span>for (int k=1;k<=K;k++)//以乘号划分阶段 
<span style="white-space:pre">	</span>for (int i=k+1;i<=n;i++)//以数字划分状态
<span style="white-space:pre">	</span>for (int j=1;j<i;j++) 
<span style="white-space:pre">	</span>f[k][i] = max(f[k][i], f[k-1][j]*a[j+1][i]);
<span style="white-space:pre">	</span>printf("%d\n", f[K][n]);
    return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值