1.Lighting System Design
题目大意为:现有一种照明系统。n种路灯,有电压v,电源价钱k,路灯价钱c,路灯需求量l。
通过的电流相同,电压越大,功率越大。要求只能以电压大的替换路灯 使花销最小。
分析:
一个种类的灯 不替换,或者全部替换成 另外一种。
f[i]表示:前 i 种灯的最小花销 f[i] = min( f[i],f[j-1]+( sum[i] - sum[i-1] )*node[i].c+node[i].k)
前i种灯中 按节点j-1 依次替换为第j种灯,或不替换 这两种状态。
Coding:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1000+5;
int n,sum[N],f[N];
struct Node
{
int v,k,c,l;
}node[N];
bool cmp (Node x,Node y)
{
return x.v<y.v;
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
cin>>node[i].v>>node[i].k>>node[i].c>>node[i].l;
sort(node+1,node+n+1,cmp);
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+node[i].l;
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
f[i]=min(f[i],f[j]+(sum[i]-sum[j])*node[i].c+node[i].k);
cout<<f[n]<<endl;
}
return 0;
}
2.Partitioning by Palindromes
输入一个由小写字母组成的字符串,要求把它划分成尽量少的回文串。输出最少的个数。
如aaadbccb最少可以划分为3个:aaa,d,bccb
输入:
第一行输入一个n表示数据组数
接下来n行每行输入一个字符串s(1<=s<=1000)
输出:
输出一个数表示最少的个数
输入样例copy 输出样例copy 2 3 aaadbccb ffgcc juzi 3 3 4
f[i] :前 i 个字符回文字符串的最小个数
Coding:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char s[1000+5];
int dp[1000+5];
bool check(int x,int y)
{
for(int i=x,j=y;i<j;i++,j--)//判断是否回文
if(s[i]!=s[j]) return false;
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>s+1;
memset(dp,0,sizeof dp);
int l=strlen(s+1);
for(int i=1;i<=l;i++)
{
dp[i]=i;//max值
for(int j=1;j<=i;j++)
if(check(j,i))
dp[i]=min(dp[i],dp[j-1]+1);
}
cout<<dp[l]<<endl;
}
return 0;
}