您的位置:首页 > 其它

uva11400照明系统设计与uva11584划分成回文串

2018-02-03 15:57 337 查看
http://blog.csdn.net/maxichu/article/details/44757599

http://blog.csdn.net/shuangde800/article/details/9669175

uva11400

题目大意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L。注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代。为了节约成本,你将设计一种系统,使之最便宜。

分析:首先需要明确一种灯泡要么全部换,要么不换。如果换一部分的话,首先电源费用得不到节约,那么节约的部分就只来自于换的那部分灯泡,既然可以节约钱干嘛不干脆全部换了呢?所以要么全换,要么不换。然后我们的算法就是先按照V排序,然后cost[i]表示解决前 i 种灯泡的最优解,那么转移方程是枚举j

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 100000
struct node {
int v, k, l, c;
bool operator<(const node &a) {
return v < a.v;
}
}arr[MAX];
int main(void) {
int n;
while (cin >> n) {

for (int i = 1; i <= n; i++)
cin >> arr[i].v >> arr[i].k >> arr[i].c >> arr[i].l;
sort(arr + 1, arr + n + 1);
int num[MAX], cost[MAX];
for (int i = 1; i <= n; i++)
num[i] = num[i - 1]+arr[i].l;
cost[0] = 0;
for (int i = 1; i <= n; i++) {
cost[i] = MAX;
for (int j = 0; j <= i; j++) {
cost[i] = min(cost[i], cost[j] + (num[i] - num[j])*arr[i].c + arr[i].k);
}
}
cout << cost
<< endl;;
}
return 0;
}


uva11584

题目大意:

给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串。问最少可以分割成多少个。

分析:

f[i]表示以i结尾的串最少可以分割的串数。

f[i] = min{ f[j]+1, 串[j,i]是回文串&&1<=j<=i }

代码:

#include<iostream>
#include<algorithm>
#include<iostream>
using namespace std;

typedef long long int64;
const int INF = 0x3f3f3f3f;
const int MAXN = 1010;

char str[MAXN];
int f[MAXN];

bool isPalind(int l, int r) {
while (l<r) {
if (str[l] != str[r]) return false;
++l; --r;
}
return true;
}

int main() {

int T;
cin>>T;
while (T--) {

cin>>str + 1;

int len = strlen(str + 1);
cout << len << endl;

9b17
memset(f, 0, sizeof(f));
for (int i = 1; i <= len; ++i) {
f[i] = i + 1;
for (int j = 1; j <= i; ++j)if (isPalind(j, i)) {
f[i] = min(f[i], f[j - 1] + 1);
}
}
printf("%d\n", f[len]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: