PROG1.
poj1260
珍珠:
有个人去买珍珠,他只能连续买几种珍珠或者单独买一种。
每个珍珠要买的数量为 ai ,每个珠子的单价为 ci ,然而每买一包珠子的时候卖家都会在里面放十个石子,也算作珠子,计算单价时以最贵的为准,保证单价单调不降。
也就是如果:
我要买单价为1的珠子10个,单价为100的1个。
我如果打包买的话,ans = (10 + 1 + 石子 * 10) * 100。
然而如果分别为1包买的话:ans = (10 + 10) * 1 + (1 + 10) * 100。
现在要求输出最小的话费。
题解:
设f[i]表示强制用i买前面某一段的最小话费。
f[i] = min(f[j] + (sum[i] - sum[j] + 10) * cost[i])
价格单调的嘛……所以这个转移一定是对的。
然后就没有啦!
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define Rep(i,n) for(int i = 1;i <= n;i ++)
#define Rep_0(i,n) for(int i = 0;i < n; i ++)
using namespace std;
const int N = 105;
int T,c[N],a[N],f[N];
int main ()
{
scanf("%d",&T);
while(T --)
{
int n;
scanf("%d",&n);
Rep(i,n)
scanf("%d%d",&a[i],&c[i]),a[i] += a[i - 1];
Rep(i,n)
{
f[i] = 1 << 29;
Rep_0(j,i)
f[i] = min(f[j] + c[i] * (10 - a[j] + a[i]),f[i]);
}
printf("%d\n",f[n]);
}
return 0;
}
Prog2:
奶(暴)牛(力)词(D)典(P)
题意:给一个字符串s,里面包含着一些单词,奶牛有个词典,要求删掉最少的字符后使得所有单词都在词典上。
题解:
太暴力了。
f[i]表示到第i个删掉的最少的字符。
g[j,k]表示j - >k包含某个单词的最少去掉的字符。
f[i] = min{f[j - 1] + g[j][i]}{0 < j <= i}
代码不写了……真的是太暴力了……
Prog3:
poj2151:
这题的确是好题。
有T个队伍,M个题目,存在一些神犇,它们至少能AC N道题目。
每道题目每个队有一定的AC概率。
求每个队伍不爆0且赛场上存在神犇的概率。
题解:
这题因为读入问题我调了半个小时。
容斥原理+SBdp
f[i][j][k]表示前i道题目,队伍j强行AC了k道题的概率。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define Rep(i,n) for(int i = 1;i <= n;i ++)
#define Rep_0(i,n) for(int i = 0;i < n; i ++)
using namespace std;
//f[i][j][k] = >第i道题,j的队伍强制AC k个
//f[i][j][k] = f[i - 1][j][k - 1] * p[i][j] + f[i - 1][j][k] * (1 - p[i][j]);
//f[0][j][0] = 1
double p[1005][35],f[1005][35][35],s[1005][35];
int main ()
{
int prom,team,K;
while(scanf("%d%d%d",&prom,&team,&K),prom | team | K)
{
memset(f,0,sizeof(f));
Rep(i,team)
Rep(j,prom)scanf("%lf",&p[i][j]); // n个题目m个队伍KAC
Rep(j,team)f[j][0][0] = 1;
Rep(i,team)
Rep(j,prom)
{
// int tmx = i & 1,tmp = i & 1 ^ 1;
for(int k = 0;k <= j;k ++)
if(k >= 1)f[i][j][k] = f[i][j - 1][k - 1] * p[i][j] + f[i][j - 1][k] * (1.0 - p[i][j]);
else f[i][j][k] = f[i][j - 1][k] * (1.0 - p[i][j]);
}
double TOT = 1;
Rep(j,team)TOT *= (1 - f[j][prom][0]);
double EX = 1;
Rep(j,team){
double tmp = 0;
Rep(k,K - 1)tmp += f[j][prom][k];
EX *= tmp;
}
printf("%.3f\n",TOT - EX);
}
return 0;
}
自己还是太水了TAT