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

2019-07-14 02:32发布

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 #include 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[n] << endl;; } return 0; } uva11584 题目大意:
给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串。问最少可以分割成多少个。 分析:
f[i]表示以i结尾的串最少可以分割的串数。
f[i] = min{ f[j]+1, 串[j,i]是回文串&&1<=j<=i } 代码: #include #include #include 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 (lif (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; 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 ", f[len]); } return 0; }